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

时间:2010-03-24 21:20:38

标签: linux bash

我想将文件中的参数用作命令行参数,用于gcc或ls等命令。

例如gcc -o output -Wall -Werro

由于文件包含:

  

-o output -Wall -Werro

用于gcc命令行调用。

6 个答案:

答案 0 :(得分:16)

某些程序使用“@”语义从文件中输入args 例如。 gcc @argfile

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

-ansi
-I/usr/include/mylib

这可以嵌套,以便argfile可以包含

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

http://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/Overall-Options.html#Overall-Options

答案 1 :(得分:11)

您可以使用xargs

cat optionsfile | xargs gcc

编辑:我被低估了,因为Laurent不知道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

答案 2 :(得分:8)

gcc `cat file.with.options`

答案 3 :(得分:4)

我建议使用$()和cat:

gcc $(cat file)

$()关于反引号(经典方式)的好处是,将一个嵌套在另一个中更容易:

gcc $(cat $(cat filename))

答案 4 :(得分:2)

使用bash

gcc $(<file)

答案 5 :(得分:2)

大多数时候,命令替换(通过反引号 或$(),正如其他人所指出的那样)很好,但要注意shell 扩张规则。特别是,请记住,不引用已完成 在之前命令替换后完成分词。

如果你的所有论点都是单词,那么这不是太糟糕 开始放空间或其他特殊字符 通常需要引用你的论点,然后你可能会见面 奇怪的结果(注意异常间距和引号) 输出):

$ echo "foo 'bar   baz'" >a
$ echo $(cat a)
foo 'bar baz'

引用整个命令子句不是解决方案, 显然,因为它会阻止单词分裂(因此,你的整体 文件的内容将显示为一个长参数而不是多个参数 选项),并且不会对报价做任何事。

$ echo "$(cat a)"
foo 'bar   baz'

解决此问题的一个解决方案是使用eval builtin:

$ eval echo "$(cat a)"
foo bar   baz

N.B。:echo可能不是这里最好的示例命令;你可能想要 用其他东西替换它,例如以下功能:

$ f() { echo $#; }