我开始用C语言编程,我问自己这个问题。
我有一个文件lol.c:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[]) {
printf ("argc\t= %d\n", argc);
for (int i=0; i < argc; i++)
printf ("argv[%i]\t= %s\n", i, argv[i]);
return 0;
}
因此,当我执行文件时(编译后):
./lol "abc" "def"
他回来了:
argc = 3
argv[0] = ./lol
argv[1] = abc
argv[2] = def
现在,我有一个bash脚本lol.sh:
#!/bin/bash
./lol "abc"
当我执行文件时:
bash lol.sh def
所以我们得到了:
argc = 2
argv[0] = ./lol
argv[1] = abc
如何获取传递到bash脚本的位置参数(从文件lol.c)?
我的第一个解决方案是将位置参数传递给lol命令,例如(lol.sh):
#!/bin/bash
./lol "abc" "$*"
他回来了:
argc = 3
argv[0] = ./lol
argv[1] = abc
argv[2] = def
我对这种解决方案不是很满意,还有另一种方法吗?
谢谢
答案 0 :(得分:0)
在"$*"
工作时,它将所有参数合并为一个,并用空格分隔原始参数。您可以通过运行以下内容查看此信息:
bash lol.sh def ghi jkl
会产生:
argc = 3
argv[0] = ./lol
argv[1] = abc
argv[2] = def ghi jkl
运行bash lol.sh
会产生:
argc = 3
argv[0] = ./lol
argv[1] = abc
argv[2] =
很少使用"$*"
来表示正确;您通常应使用"$@"
逐字传递参数作为单独的参数,并正确处理“无参数”(而"$*"
创建一个空字符串作为参数)。
此命令应执行您想要的操作:
./lol "abc" "$@"
那么bash lol.sh def ghi jkl
的输出将是:
argc = 5
argv[0] = ./lol
argv[1] = abc
argv[2] = def
argv[3] = ghi
argv[4] = jkl
,来自bash lol.sh
的输出为:
argc = 2
argv[0] = ./lol
argv[1] = abc
答案 1 :(得分:0)
我尝试@mnistic的建议,即获取父进程并获取其命令行。
所以我尝试了这个:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define SIZE 1024
int main (int argc, char *argv[]) {
int ppid = getppid();
char cmd[SIZE];
FILE* file = NULL;
sprintf(cmd, "/proc/%d/cmdline", ppid);
file = fopen(cmd, "r");
if (file != NULL)
while (fgets(cmd, SIZE, file) != NULL)
printf("%s\n", cmd);
fclose(file);
return 0;
}
在bash文件中:
#!/bin/bash
./lol
我们称之为bash脚本:
bash lol.sh abc def
但是它仅返回“ bash”,而不返回命令的其余部分...
如何实现?
谢谢