Linux 如何从文件传递命令行参数

Linux 如何从文件传递命令行参数,linux,pipe,command-line-arguments,cat,argv,Linux,Pipe,Command Line Arguments,Cat,Argv,我有一个从argv读取命令行参数的C程序。是否可以使用管道将文件内容作为命令行参数重定向到我的程序?假设我有一个包含以下内容的文件arguments.dat: 0 0.2 302 0 我希望调用我的程序时使用: ./myprogram 0 0.2 302 0 我尝试了以下方法: cat arguments.dat | ./myprogram 没有成功 您的答案是: cat arguments.dat | xargs ./myprogram 或更简单: xargs -a arguments

我有一个从argv读取命令行参数的C程序。是否可以使用管道将文件内容作为命令行参数重定向到我的程序?假设我有一个包含以下内容的文件
arguments.dat

0 0.2 302 0
我希望调用我的程序时使用:

./myprogram 0 0.2 302 0
我尝试了以下方法:

cat arguments.dat | ./myprogram

没有成功

您的答案是:

cat arguments.dat | xargs ./myprogram
或更简单:

xargs -a arguments.dat ./myprogram

查看手册,了解定制
xargs
的多种方法。例如,您可以逐行而不是逐字读取,并且可以在更复杂的替换中使用参数。

对于大多数Shell,您可以使用
$将文件内容插入命令行(如果不希望以静默方式拆分参数)
…也就是说:下面的答案适用于将
/myprogram--first-value“
默认更改为
/myprogram--first-argument;/myprogram”first-value“
是不可接受的情况

如果您的参数是一对一的文字 也就是说,如果您的输入看起来像:

--first-argument
first value
--second-argument
second value
你的意思是说:

./myprogram --first-argument "first value" --second-argument "second value"
./myprogram --first-argument "first value" --second-argument "second value"
…然后您应该使用(与bash 4.0或更高版本配合使用):

…你的意思是说:

./myprogram --first-argument "first value" --second-argument "second value"
./myprogram --first-argument "first value" --second-argument "second value"
…那么您应该使用:

args=( )
while IFS= read -r -d '' arg; do
  args+=( "$arg" )
done < <(xargs printf '%s\0' <arguments.dat)
…并按如下方式对其进行分析:

args=( )
while IFS= read -r -d '' arg; do
  args+=( "$arg" )
done <arguments.dat
./myprogram "${args[@]}"
使用BSD xargs(MacOS、FreeBSD/OpenBSD/etc):


xargs-0./myprogram“第一个参数”“第二个参数”
,则传递
“first
作为一个参数,
参数“
作为第二个,
”second
作为第三个。如果它包含,
*.txt
,它将替换为文本文件列表,而不是保留文本文件。如果文件包含
“*.txt”
,则引号将作为字符串的文本部分传递(如果用户没有
nullglob
failglob
导致Previor被视为失败的glob…那么,如果没有任何文件的名称以文本双引号字符开头和结尾,则将失败)。这里有一些注意事项——如果文件包含的参数超过单个命令行的适用范围(请记住,环境变量和命令行参数使用相同的空间,因此
export
ing太多或太大的命令行变量会减少最大命令行长度),
xargs
将多次运行
/myprogram
,在调用中分割参数。@CharlesDuffy:这一点很好。这可能是一个bug,也可能是一个非常需要的功能,具体取决于用例。在任何情况下,我添加了另一种机制。@CharlesDuffy:是的,的确如此。Bash还有一种方法可以让您使用编辑器。
xargs
有很多高级的操作方法,可以让你引用参数,逐行阅读等等。@CharlesDuffy:是的,这绝对是我在可重用脚本中要做的。不过,如果是一次性使用,如果你大致知道参数是什么,那么简单的xargs通常就是你所需要的一切。当然。我正在尝试关于正确性的争论,因为StackOverflow答案本质上是可重用的——它(理想情况下)将被很多人阅读和使用(在许多不同的场景中,其中一些用例可能与OP不同),因此,花时间和精力正确处理细节是值得的。也就是说,如果我要添加一个相互竞争的答案,请随时告诉我。:)
./myprogram --first-argument "first value" --second-argument "second value"
args=( )
while IFS= read -r -d '' arg; do
  args+=( "$arg" )
done < <(xargs printf '%s\0' <arguments.dat)
printf '%s\0' "argument one" "argument two" >arguments.dat
args=( )
while IFS= read -r -d '' arg; do
  args+=( "$arg" )
done <arguments.dat
./myprogram "${args[@]}"
xargs -d $'\n' ./myprogram <arguments.dat
xargs -0 ./myprogram < <(tr '\n' '\0' <arguments.dat)
xargs ./myprogram <arguments.dat
xargs -0 ./myprogram <arguments.dat