比如说,我有一个文件foo.txt,指定了N个参数
arg1
arg2
...
argN
我需要传递给命令my_command
如何使用文件的行作为命令的参数?
比如说,我有一个文件foo.txt,指定了N个参数
arg1
arg2
...
argN
我需要传递给命令my_command
如何使用文件的行作为命令的参数?
当前回答
这些答案似乎都不适合我,也不是太复杂。幸运的是,xargs并不复杂(在Ubuntu 20.04上测试)。
正如OP提到的那样,这适用于文件中单独一行的每个参数,也是我所需要的。
cat foo.txt | xargs my_command
需要注意的一点是,它似乎不适用于别名命令。
如果命令接受一个字符串中包装的多个参数,则接受的答案有效。在我使用(Neo)Vim的情况下,它不会和参数都粘在一起。
Xargs正确地做到了这一点,实际上为命令提供了单独的参数。
其他回答
你可以使用反勾:
echo World > file.txt
echo Hello `cat file.txt`
如果你所需要做的就是将文件arguments.txt的内容
arg1
arg2
argN
进入my_command arg1 arg2 argN,然后你可以简单地使用xargs:
xargs -a arguments.txt my_command
你可以在xargs调用中添加额外的静态参数,比如xargs -a arguments.txt my_command staticArg,它将调用my_command staticArg arg1 arg2 argN
如前所述,可以使用反撇号或$(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
我建议使用:
command $(echo $(tr '\n' ' ' < parameters.cfg))
只需修改结束行字符并将其替换为空格,然后使用echo将结果字符串作为可能的单独参数推入。