来自文件内容的命令行参数
如何将文件内容转换为Unix命令的参数?
将参数转换为文件内容的步骤如下:
echo ABC > file.txt
但是另一个方向?
如果你的shell是bash(其他), $(cat afile)
的快捷方式是$(< afile)
,所以你可以这样写:
mycommand "$(< file.txt)"
在“命令replace”部分的bash手册页中logging。
改变,从标准input读取你的命令,所以: mycommand < file.txt
如前所述,您可以使用反引号或$(cat filename)
。
什么没有提到,我认为重要的是要注意,是你必须记住shell将按照空格分割该文件的内容,把它发现的每个“单词”作为一个参数。 尽pipe你可以用引号将命令行参数括起来,以便它可以包含空格,转义序列等,但是从文件中读取不会做同样的事情。 例如,如果您的文件包含:
a "bc" d
你会得到的论据是:
a "b c" d
如果你想把每一行作为参数,使用while / read / do结构:
while read i ; do command_name $i ; done < filename
你使用反引号来做到这一点:
echo World > file.txt echo Hello `cat file.txt`
command `< file`
会将文件内容传递给stdin上的命令,但会去掉换行符,这意味着你不能单独遍历每一行。 为此,你可以写一个'for'循环的脚本:
for i in `cat input_file`; do some_command $i; done
如果你想以一种可靠的方式来实现这个function,那么对于每一个可能的命令行参数(带空格的值,带有换行符的值,带有引号字符的值,不可打印的值,带有glob字符的值等等)更有意思的。
要写入一个文件,给定一个参数数组:
printf '%s\0' "${arguments[@]}" >file
……用"argument one"
, "argument two"
等取代。
从该文件读取并使用其内容(在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语言将NUL分隔的内容转换为eval
-safe格式:
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 "$@"
以下是我如何将文件的内容作为parameter passing给命令:
./foo --bar "$(cat ./bar.txt)"
在我的bash shell中,以下就像一个魅力:
cat input_file | xargs -I % sh -c 'command1 %; command2 %; command3 %;'
其中input_file是
arg1 arg2 arg3
很明显,这允许你从input_file的每行执行多个命令,这是我在这里学到的一个很好的小技巧。