假设我想使用字符串参数运行./program如果<file>是一个包含字符串的文件,我如何执行./program <file>,而不是每次都输入./program string?谢谢
./program
<file>
./program <file>
./program string
rqcrx0a61#
这应该可以达到目的:
./program `cat file`
如果你想把整个文件的内容放在一个参数中,可以加上双引号(在bash中测试过,我认为不同的shell会有所不同):
./program "`cat file`"
carvr3hs2#
./program "$(< file)"
$(cmd)
cmd
cat file
$(cat file)
$(< file)
q5lcpyga3#
您可以使用以下选项之一:
./program $(cat file) ./program "$(cat file)"
如果文件中可能有多个单词,并且您希望将它们视为单个参数,则后者非常有用。无论如何,我更喜欢使用if $()而不是backticks,因为它可以嵌套(在本例中,这可能不是一个 * 要求 )。还要记住,这个答案(和其他答案)更多地与使用的shell有关,而不是Linux本身。因为占主导地位的 * 和最好的:-) shell似乎是bash,所以我专门为此编写了代码。这实际上是在UNIX下终止进程的一种相当常见的方式。守护进程(如cron)会将其进程ID写入文件(如/var/cron.pid),您可以使用如下命令:
$()
bash
cron
/var/cron.pid
kill -HUP $(cat /var/cron.pid)
bbuxkriu4#
另一个选项是xargs:
xargs -a file ./program
在手册页中:xargs从标准输入读取由空格或换行符分隔的项,并使用任何initial-arguments后跟从标准输入读取的项执行命令一次或多次。简单地说,xargs将执行命令,添加file的内容作为附加参数,并使用空格或换行符分隔它们。更多选项请参见man xargs。
file
baubqpgj5#
以上所有答案都有效,但我发现最简洁、最容易键入的选项是
xargs < file ./program
abithluo6#
这是@robbrit answer的扩展名。考虑一个 file.txt,其内容为:以及a * 程序.c*,其内容为:
#include<stdio.h> void main(int argc, char** argv) { for (int i = 0; i < argc; i++) printf("Arg %d: %s\n", i, argv[i]); }
下面是如果您传递带引号和不带引号的命令行参数时会发生的情况:
$ gcc program.c -o program $ ./program `cat file` Arg 0: ./program Arg 1: 1 Arg 2: 2 Arg 3: 3 Arg 4: 4 Arg 5: 5 Arg 6: 6 $ ./program "`cat file`" Arg 0: ./program Arg 1: 1 2 3 4 5 6
6条答案
按热度按时间rqcrx0a61#
这应该可以达到目的:
如果你想把整个文件的内容放在一个参数中,可以加上双引号(在bash中测试过,我认为不同的shell会有所不同):
carvr3hs2#
命令
解释
$(cmd)
运行一个命令并将其输出转换为字符串。$(cmd)
也可以用反勾号写为cmd
。我更喜欢较新的$(cmd)
,因为它比旧学校的反勾号嵌套得更好。1.我们需要的命令是
cat file
,然后在bash手册页中:命令替换
$(cat file)
可以替换为等效但更快的$(< file)
。1.它周围的引号确保了空格被保留,以防你的文件中有空格或换行符。在shell脚本中正确地引用是一项非常缺乏的技能。引用变量和命令替换是一个好习惯,这样当你的文件名或变量值有空格或控制字符或其他奇怪的东西时,你就不会有麻烦了。
q5lcpyga3#
您可以使用以下选项之一:
如果文件中可能有多个单词,并且您希望将它们视为单个参数,则后者非常有用。无论如何,我更喜欢使用if
$()
而不是backticks,因为它可以嵌套(在本例中,这可能不是一个 * 要求 )。还要记住,这个答案(和其他答案)更多地与使用的shell有关,而不是Linux本身。因为占主导地位的 * 和最好的:-) shell似乎是
bash
,所以我专门为此编写了代码。这实际上是在UNIX下终止进程的一种相当常见的方式。守护进程(如
cron
)会将其进程ID写入文件(如/var/cron.pid
),您可以使用如下命令:bbuxkriu4#
另一个选项是xargs:
在手册页中:
xargs从标准输入读取由空格或换行符分隔的项,并使用任何initial-arguments后跟从标准输入读取的项执行命令一次或多次。
简单地说,xargs将执行命令,添加
file
的内容作为附加参数,并使用空格或换行符分隔它们。更多选项请参见man xargs。
baubqpgj5#
以上所有答案都有效,但我发现最简洁、最容易键入的选项是
abithluo6#
这是@robbrit answer的扩展名。
考虑一个 file.txt,其内容为:
以及a * 程序.c*,其内容为:
下面是如果您传递带引号和不带引号的命令行参数时会发生的情况: