假设我想使用字符串参数
运行./program
而不是打字
每次./program string
,我如何./program <file>
其中<file>
是包含字符串的文件?
thankyou
答案 0 :(得分:47)
这应该可以解决问题:
./program `cat file`
如果您希望将整个文件内容放在一个参数中,请添加双引号(在bash中测试。我认为它可能因shell而异):
./program "`cat file`"
答案 1 :(得分:26)
./program "$(< file)"
$(cmd)
运行命令并将其输出转换为字符串。 $(cmd)
也可以用反引号`cmd`
编写。我更喜欢较新的$(cmd)
,因为它比旧学校的反对更好。
我们想要的命令是cat file
。然后从bash手册页:
命令替换
$(cat file)
可以替换为等效但更快$(< file)
。
它周围的引号确保保留空格,以防你的文件中有空格或换行符。正确引用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