分隔 C 程序参数的语法是什么?例如,如果我输入:
./myprogram 1 2 3 | grep result
将| grep result
被解释为参数(并作为 传递argv
)。那么如何终止之后的争论呢3
?
答案1
我不认为这是真的。 shell 负责解释命令行参数,并在解析命令行参数时将它们传递给相应的命令。
所以你的 C 程序,当它最终被执行时,只会看到参数 1、2 和 3。管道和后面的所有内容都是 shell 的责任,不会作为参数传递给 C 程序。
下面是一个使用 bash shell 和 bash shell 脚本的示例。
示例(shell 脚本)
示例脚本test.bash
:
#!/bin/bash
file=somefile
[ -f $file ] && rm $file
for var in "$@"
do
echo "$var" >> $file
done
cat $file
现在运行脚本,结果存储在文件中somefile
:
$ ./test.bash 1 2 3 '4 5'
1
2
3
4 5
使用附加命令行参数运行它:
$ ./test.bash 1 2 3 '4 5' | echo hi
hi
$ cat somefile
1
2
3
4 5
在这两种情况下,脚本test.bash
仅看到通向管道 (|) 的参数。 Bash shell 负责解析命令,因此它之后不会显示任何内容,包括管道 (|)。
示例(C 程序)
如果对使用 shell 脚本有任何疑问,这里有一个接受命令行参数的 ac 程序,您也可以看到与它相同的行为。
c 程序称为testc.c
:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
printf("Program name: %s\n", argv[0]);
while ((argc > 1))
{
printf("%s\n",&argv[1][0]);
++argv;
--argc;
}
return (0);
}
像这样编译它:
gcc testc.c -o testc
像这样使用它:
./testc
1
2
3
4 5
$ ./testc 1 2 3 '4 5' | echo hi
hi
您可以在上面看到,只有前 4 个参数呈现给我的 c 程序,testc
.