比如说,我有一个文件foo.txt,指定了N个参数

arg1
arg2
...
argN

我需要传递给命令my_command

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


当前回答

如前所述,可以使用反撇号或$(cat文件名)。

我认为有必要注意的一点是,您必须记住shell将根据空白分隔该文件的内容,并将它找到的每个“单词”作为参数提供给您的命令。虽然您可以将命令行参数括在引号中,以便它可以包含空格、转义序列等,但从文件中读取不会做同样的事情。例如,如果你的文件包含:

a "b c" d

你会得到的论点是:

a
"b
c"
d

如果你想拉出每一行作为参数,使用while/read/do结构:

while read i ; do command_name $i ; done < filename

其他回答

这两种解决方案即使在行中有空格时也有效:

readarray -t my_args < foo.txt
my_command "${my_args[@]}"

如果readarray不起作用,用mapfile代替它,它们是同义词。

我以前尝试过下面这个,但当my_command是一个脚本时有问题:

xargs -d '\n' -a foo.txt my_command

在我的bash shell下面的工作就像一个魅力:

cat input_file | xargs -I % sh -c 'command1 %; command2 %; command3 %;'

input_file在哪里

arg1
arg2
arg3

显然,这允许您对input_file中的每一行执行多个命令,这是我在这里学到的一个不错的小技巧。

我建议使用:

command $(echo $(tr '\n' ' ' < parameters.cfg))

只需修改结束行字符并将其替换为空格,然后使用echo将结果字符串作为可能的单独参数推入。

下面是我如何将文件内容作为参数传递给命令:

./foo --bar "$(cat ./bar.txt)"

这些答案似乎都不适合我,也不是太复杂。幸运的是,xargs并不复杂(在Ubuntu 20.04上测试)。

正如OP提到的那样,这适用于文件中单独一行的每个参数,也是我所需要的。

cat foo.txt | xargs my_command

需要注意的一点是,它似乎不适用于别名命令。

如果命令接受一个字符串中包装的多个参数,则接受的答案有效。在我使用(Neo)Vim的情况下,它不会和参数都粘在一起。

Xargs正确地做到了这一点,实际上为命令提供了单独的参数。