Linux 如何使用文件内容作为命令行参数?

Linux 如何使用文件内容作为命令行参数?,linux,bash,Linux,Bash,我想使用文件中的参数作为一些命令(如gcc或ls)的命令行参数 例如gcc-o输出-Wall-Werro 该文件由以下部分组成: -o输出-墙壁-Werro 用于gcc命令行调用。您可以使用xargs: gcc `cat file.with.options` cat optionsfile | xargs gcc 编辑:我被否决了,因为劳伦特不知道xargs是如何工作的,所以这里有证据: $ echo "-o output -Wall -Werro" > optionsfile $ c

我想使用文件中的参数作为一些命令(如gcc或ls)的命令行参数

例如
gcc-o输出-Wall-Werro

该文件由以下部分组成:

-o输出-墙壁-Werro


用于gcc命令行调用。

您可以使用
xargs

gcc `cat file.with.options`
cat optionsfile | xargs gcc
编辑:我被否决了,因为劳伦特不知道
xargs
是如何工作的,所以这里有证据:

$ echo "-o output -Wall -Werro" > optionsfile
$ cat optionsfile | xargs -t gcc
gcc -o output -Wall -Werro
i686-apple-darwin10-gcc-4.2.1: no input files
-t
标志使命令在执行之前写入
stderr

使用bash

gcc $(<file)
gcc$(我建议将
$()
与cat一起使用:

gcc $(cat file)
$()
优于backticks(经典方式)的好处在于,更容易将一个嵌套在另一个中:

gcc $(cat $(cat filename))

大多数情况下,命令替换(通过反勾号 或者,正如其他人指出的那样,$()是可以的,但是要当心shell 扩展规则。尤其要记住,取消引用是完成的 在命令替换之前和之后执行单词拆分

如果你所有的论点都是文字,但如果你 开始放置空格或其他特殊字符,以便 通常需要在你的论点中引用,然后你可能会遇到 结果奇怪(请注意中的异常间距和引号) 输出):

引用整个命令子替换不是解决方案, 显然,因为它可以防止分词(因此,您的整个 文件的内容将显示为一个长参数,而不是多个 选项),并且不会对引号做任何处理

$ echo "$(cat a)"
foo 'bar   baz'
一种解决方案是使用eval内置:

$ eval echo "$(cat a)"
foo bar   baz
注意:echo可能不是这里最好的示例命令;您可能希望 将其替换为其他功能,例如以下功能:

$ f() { echo $#; }
有些程序使用“@”语义从文件中输入参数 例如gcc@argfile

其中,对于gcc,argfile包含选项

-ansi
-I/usr/include/mylib
这可以嵌套,以便argfile可以包含

-ansi
-I/usr/include/mylib
@argfile2

gcc$(cat filename.txt)
--可能需要引号。请注意,这些是反勾号,而不是单引号。@Laurent,这是完全错误的。我编写的命令执行
gcc-o output-Wall-Werro
。如果您不相信,请自己尝试。甚至“xargs gcccmd
中达到8196个字符限制,则会遇到更大的问题。任何足以理解
$()
语法的现代工具也知道如何打开和重定向文件本身,避免使用无用的
cat
过程。例如,
gcc$(
-ansi
-I/usr/include/mylib
@argfile2