使用linux我怎样才能把一个文件的内容作为一个参数传递给一个可执行文件?

nzkunb0c  于 2023-01-12  发布在  Linux
关注(0)|答案(6)|浏览(261)

假设我想使用字符串参数运行./program
如果<file>是一个包含字符串的文件,我如何执行./program <file>,而不是每次都输入./program string
谢谢

rqcrx0a6

rqcrx0a61#

这应该可以达到目的:

./program `cat file`

如果你想把整个文件的内容放在一个参数中,可以加上双引号(在bash中测试过,我认为不同的shell会有所不同):

./program "`cat file`"
carvr3hs

carvr3hs2#

命令

./program "$(< file)"

解释

  1. $(cmd)运行一个命令并将其输出转换为字符串。$(cmd)也可以用反勾号写为cmd。我更喜欢较新的$(cmd),因为它比旧学校的反勾号嵌套得更好。
    1.我们需要的命令是cat file,然后在bash手册页中:
    命令替换$(cat file)可以替换为等效但更快的$(< file)
    1.它周围的引号确保了空格被保留,以防你的文件中有空格或换行符。在shell脚本中正确地引用是一项非常缺乏的技能。引用变量和命令替换是一个好习惯,这样当你的文件名或变量值有空格或控制字符或其他奇怪的东西时,你就不会有麻烦了。
q5lcpyga

q5lcpyga3#

您可以使用以下选项之一:

./program $(cat file)
./program "$(cat file)"

如果文件中可能有多个单词,并且您希望将它们视为单个参数,则后者非常有用。无论如何,我更喜欢使用if $()而不是backticks,因为它可以嵌套(在本例中,这可能不是一个 * 要求 )。
还要记住,这个答案(和其他答案)更多地与使用的shell有关,而不是Linux本身。因为占主导地位的 * 和最好的:-)
shell似乎是bash,所以我专门为此编写了代码。
这实际上是在UNIX下终止进程的一种相当常见的方式。守护进程(如cron)会将其进程ID写入文件(如/var/cron.pid),您可以使用如下命令:

kill -HUP $(cat /var/cron.pid)
bbuxkriu

bbuxkriu4#

另一个选项是xargs:

xargs -a file ./program

在手册页中:
xargs从标准输入读取由空格或换行符分隔的项,并使用任何initial-arguments后跟从标准输入读取的项执行命令一次或多次。
简单地说,xargs将执行命令,添加file的内容作为附加参数,并使用空格或换行符分隔它们。
更多选项请参见man xargs。

baubqpgj

baubqpgj5#

以上所有答案都有效,但我发现最简洁、最容易键入的选项是

xargs < file ./program
abithluo

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

相关问题