使用linux如何将文件的内容作为参数传递给可执行文件?

时间:2010-11-22 00:48:55

标签: linux

假设我想使用字符串参数

运行./program

而不是打字     每次./program string,我如何./program <file>其中<file>是包含字符串的文件?

thankyou

6 个答案:

答案 0 :(得分:47)

这应该可以解决问题:

./program `cat file`

如果您希望将整个文件内容放在一个参数中,请添加双引号(在bash中测试。我认为它可能因shell而异):

./program "`cat file`" 

答案 1 :(得分:26)

命令

./program "$(< file)"

解释

  1. $(cmd)运行命令并将其输出转换为字符串。 $(cmd)也可以用反引号`cmd`编写。我更喜欢较新的$(cmd),因为它比旧学校的反对更好。

  2. 我们想要的命令是cat file。然后从bash手册页:

      

    命令替换$(cat file)可以替换为等效但更快$(< file)

  3. 它周围的引号确保保留空格,以防你的文件中有空格或换行符。正确引用shell脚本中的内容是一项非常缺乏的技能。引用变量和命令替换是一个很好的习惯,因此当文件名或变量值有空格或控制字符或其他奇怪现象时,你不会稍后得到它。

答案 2 :(得分:5)

您可以使用以下方法之一:

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

如果文件中可能有多个单词并且您希望将它们视为单个参数,则后者非常有用。在任何情况下,我更喜欢使用if $()来反对,因为它具有嵌套能力(在这种情况下可能不是要求)。

还要记住,这个答案(和其他人)与使用中的shell更相关,而不是Linux本身。由于主要的 和最好的: - ) shell似乎是bash,所以我专门编写了这个。

这实际上是在UNIX相似的情况下杀死进程的一种相当常见的方法。守护程序(如cron)会将其进程ID写入文件(如/var/cron.pid),您可以通过以下方式发出信号:

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

答案 3 :(得分:5)

另一种选择是xargs:

cat file | xargs ./program

我个人觉得这个版本更容易阅读,特别是如果你做的不仅仅是捕捉文件。

从手册页:

  

xargs从标准输入读取项目,由空格或换行符分隔,并使用任何初始参数执行命令一次或多次,后跟从标准输入读取的项目。

简单来说,xargs将对每个传送给它的行/单词执行./program。

有关更多选项,请参阅man xargs。

答案 4 :(得分:1)

以上所有答案都有效,但我发现最干净,最容易输入的选项是

xargs < file ./program

答案 5 :(得分:0)

这是@robbrit答案的扩展名。

考虑包含内容的 file.txt

1 2 3
4 5 6

还有一个 program.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