比如说,我有一个文件foo.txt,指定了N个参数
arg1
arg2
...
argN
我需要传递给命令my_command
如何使用文件的行作为命令的参数?
比如说,我有一个文件foo.txt,指定了N个参数
arg1
arg2
...
argN
我需要传递给命令my_command
如何使用文件的行作为命令的参数?
当前回答
你可以使用反勾:
echo World > file.txt
echo Hello `cat file.txt`
其他回答
如前所述,可以使用反撇号或$(cat文件名)。
我认为有必要注意的一点是,您必须记住shell将根据空白分隔该文件的内容,并将它找到的每个“单词”作为参数提供给您的命令。虽然您可以将命令行参数括在引号中,以便它可以包含空格、转义序列等,但从文件中读取不会做同样的事情。例如,如果你的文件包含:
a "b c" d
你会得到的论点是:
a
"b
c"
d
如果你想拉出每一行作为参数,使用while/read/do结构:
while read i ; do command_name $i ; done < filename
下面是我如何将文件内容作为参数传递给命令:
./foo --bar "$(cat ./bar.txt)"
这两种解决方案即使在行中有空格时也有效:
readarray -t my_args < foo.txt
my_command "${my_args[@]}"
如果readarray不起作用,用mapfile代替它,它们是同义词。
我以前尝试过下面这个,但当my_command是一个脚本时有问题:
xargs -d '\n' -a foo.txt my_command
command `< file`
将文件内容传递给stdin上的命令,但将删除换行符,这意味着您不能单独遍历每一行。为此,你可以写一个带有' For '循环的脚本:
for line in `cat input_file`; do some_command "$line"; done
或者(多行变体):
for line in `cat input_file`
do
some_command "$line"
done
或者(多行变体,用$()代替' '):
for line in $(cat input_file)
do
some_command "$line"
done
引用:
对于循环语法:https://www.cyberciti.biz/faq/bash-for-loop/
如果您希望以一种适用于所有可能的命令行参数(带有空格的值、带有换行符的值、带有文字引号的值、不可打印的值、带有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 "$@"