Linux 如何使用文件的行作为命令的参数?
比如说,我有一个文件Linux 如何使用文件的行作为命令的参数?,linux,unix,shell,command-line,command-line-arguments,Linux,Unix,Shell,Command Line,Command Line Arguments,比如说,我有一个文件foo.txt指定N参数 arg1 arg2 ... argN 我需要将其传递给命令my_命令 如何将文件的行用作命令的参数?您可以使用反勾号: echo World > file.txt echo Hello `cat file.txt` 如果您的shell是bash(以及其他shell),那么$(cat-afile)的快捷方式是$(
foo.txt
指定N
参数
arg1
arg2
...
argN
我需要将其传递给命令my_命令
如何将文件的行用作命令的参数?您可以使用反勾号:
echo World > file.txt
echo Hello `cat file.txt`
如果您的shell是bash(以及其他shell),那么$(cat-afile)
的快捷方式是$(
,因此您可以编写:
mycommand "$(< file.txt)"
mycommand“$(
记录在“命令替换”部分的bash手册页中
或者,让您的命令从stdin读取,因此:mycommand
command `< file`
或(多行变量):
或(多行变量,用$()
代替`
):
参考资料:
如前所述,您可以使用反勾号或
$(cat文件名)
我认为需要注意的是,没有提到的是,您必须记住,shell将根据空格分隔该文件的内容,并将它找到的每个“单词”作为参数提供给您的命令。虽然您可以将命令行参数括在引号中,以便它可以包含空格、转义序列等,但从文件中读取不会做同样的事情。例如,如果您的文件包含:
a "b c" d
您将得到以下参数:
a
"b
c"
d
如果要将每一行作为参数,请使用while/read/do结构:
while read i ; do command_name $i ; done < filename
阅读时;do命令_name$i;完成<文件名
在我的bash shell中,以下功能非常有效:
cat input_file | xargs -I % sh -c 'command1 %; command2 %; command3 %;'
输入文件的位置
arg1
arg2
arg3
很明显,这允许您使用输入文件中的每一行执行多个命令,这是我学到的一个很好的小技巧。如果您希望以一种健壮的方式执行此操作,并且适用于每个可能的命令行参数(带空格的值、带换行符的值、带文字引号字符的值、不可打印的值、带全局字符的值等等),它变得更有趣一些
若要写入文件,请给定参数数组:
printf '%s\0' "${arguments[@]}" >file
…替换为“参数一”
,“参数二”
等,视情况而定
要从该文件中读取并使用其内容(在bash、ksh93或另一个最近的带有数组的shell中),请执行以下操作:
以下是我如何将文件内容作为参数传递给命令:
./foo --bar "$(cat ./bar.txt)"
如果您需要做的只是打开文件
arguments.txt
,其中包含内容
arg1
arg2
argN
进入my_命令arg1 arg2 argN
,您只需使用xargs
:
xargs -a arguments.txt my_command
你可以在xargs
调用中添加额外的静态参数,比如xargs-a arguments.txt my_command staticArg
,它将调用my_command staticArg arg arg1 arg2 argN
在编辑了几次之后,我觉得我的更改太大了,无法继续更改他的答案而不是编写我自己的答案。因此,我决定我需要写我自己的
在中读取文件的每一行,并按如下方式逐行操作:
#!/bin/bash
input="/path/to/txt/file"
while IFS= read -r line
do
echo "$line"
done < "$input"
参考资料:
git add
:command $(echo $(tr '\n' ' ' < parameters.cfg))
command$(echo$(tr'\n'
只需修剪结束行字符并用空格替换它们,然后使用echo将结果字符串作为可能的独立参数推送。没有一个答案对我有效或太复杂。幸运的是,使用
xargs
(在Ubuntu 20.04上测试)并不复杂
这与OP提到的文件中单独一行上的每个arg一起工作,这也是我所需要的
cat foo.txt | xargs my_command
需要注意的一点是,它似乎不适用于别名命令
如果命令接受一个字符串中包含的多个参数,那么接受的答案就起作用了。在我的例子中,使用(Neo)Vim时,它不起作用,并且这些参数都粘在一起
xargs
可能并实际上为您提供了单独的命令参数。我应该提到,我假设您使用的是bash。我知道还有其他shell,但我使用过的几乎所有*nix机器都运行bash或其他等效程序。IIRC,这种语法应该是相同的在ksh和zsh上,Read应该是Read-r
,除非您想扩展反斜杠转义序列,而且NUL是比换行符更安全的分隔符,特别是当您传递的参数是文件名之类的东西时,它可以包含文字换行符。此外,在不清除IFS的情况下,您会隐式地得到前导空格和尾随空格从i
参数、复数或“参数”中清除,single?接受的答案仅在单参数情况下是正确的——这是正文所查询的内容——但在主题似乎要查询的多参数情况下是不正确的。下面的4个答案通常有相同的结果,但它们的语义略有不同。现在我想起了为什么我停止编写bash脚本:PYour“漂亮的小把戏”从安全角度来看是危险的——如果你有一个参数包含$(somecommand)
,你将得到该命令的执行,而不是作为文本传递。同样地,/etc/passwd
将被处理为重定向和覆盖/etc/passwd
(如果使用适当的权限运行)(在具有GNU扩展的系统上)执行以下操作更安全:xargs-d$'\n'sh-c'表示arg;do command1“$arg”;command2“arg”;command3“arg”;done'
——而且效率更高,因为它向每个shell传递尽可能多的参数,而不是在输入文件中每行启动一个shell。当然,也会丢失,将
放在backticks中意味着它根本不执行命令的重定向。(投票人是否真的测试了它?命令`
在bash或POSIX sh中都不起作用;
./foo --bar "$(cat ./bar.txt)"
arg1
arg2
argN
xargs -a arguments.txt my_command
#!/bin/bash
input="/path/to/txt/file"
while IFS= read -r line
do
echo "$line"
done < "$input"
while IFS= read -r line
do
echo " git add \"$line\""
git add "$line"
done < "$FILES_STAGED"
command $(echo $(tr '\n' ' ' < parameters.cfg))
cat foo.txt | xargs my_command