比如说,我有一个文件foo.txt,指定了N个参数
arg1
arg2
...
argN
我需要传递给命令my_command
如何使用文件的行作为命令的参数?
比如说,我有一个文件foo.txt,指定了N个参数
arg1
arg2
...
argN
我需要传递给命令my_command
如何使用文件的行作为命令的参数?
当前回答
在我的bash shell下面的工作就像一个魅力:
cat input_file | xargs -I % sh -c 'command1 %; command2 %; command3 %;'
input_file在哪里
arg1
arg2
arg3
显然,这允许您对input_file中的每一行执行多个命令,这是我在这里学到的一个不错的小技巧。
其他回答
在我的bash shell下面的工作就像一个魅力:
cat input_file | xargs -I % sh -c 'command1 %; command2 %; command3 %;'
input_file在哪里
arg1
arg2
arg3
显然,这允许您对input_file中的每一行执行多个命令,这是我在这里学到的一个不错的小技巧。
如果你所需要做的就是将文件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
这些答案似乎都不适合我,也不是太复杂。幸运的是,xargs并不复杂(在Ubuntu 20.04上测试)。
正如OP提到的那样,这适用于文件中单独一行的每个参数,也是我所需要的。
cat foo.txt | xargs my_command
需要注意的一点是,它似乎不适用于别名命令。
如果命令接受一个字符串中包装的多个参数,则接受的答案有效。在我使用(Neo)Vim的情况下,它不会和参数都粘在一起。
Xargs正确地做到了这一点,实际上为命令提供了单独的参数。
如果您希望以一种适用于所有可能的命令行参数(带有空格的值、带有换行符的值、带有文字引号的值、不可打印的值、带有glob字符的值等)的健壮方式来执行此操作,则会变得更加有趣。
写入文件,给定一个参数数组:
printf '%s\0' "${arguments[@]}" >file
…替换为“论点一”、“论点二”等。
要从该文件读取并使用其内容(在bash、ksh93或其他最新的带有数组的shell中):
declare -a args=()
while IFS='' read -r -d '' item; do
args+=( "$item" )
done <file
run_your_command "${args[@]}"
要从该文件读取并使用其内容(在没有数组的shell中;注意,这将覆盖你的本地命令行参数列表,因此最好在函数内部完成,这样你就覆盖了函数的参数而不是全局列表):
set --
while IFS='' read -r -d '' item; do
set -- "$@" "$item"
done <file
run_your_command "$@"
注意-d(允许使用不同的行结束分隔符)是非posix扩展,没有数组的shell也可能不支持它。如果是这样的话,你可能需要使用非shell语言将null分隔的内容转换为eval安全的形式:
quoted_list() {
## Works with either Python 2.x or 3.x
python -c '
import sys, pipes, shlex
quote = pipes.quote if hasattr(pipes, "quote") else shlex.quote
print(" ".join([quote(s) for s in sys.stdin.read().split("\0")][:-1]))
'
}
eval "set -- $(quoted_list <file)"
run_your_command "$@"
我建议使用:
command $(echo $(tr '\n' ' ' < parameters.cfg))
只需修改结束行字符并将其替换为空格,然后使用echo将结果字符串作为可能的单独参数推入。