我正在尝试实现一个程序,该程序接受一个进程,后跟一个由管道命令组成的字符串。如何将命令串分隔成{单个命令/任意数量的参数数组}“|”是分隔不同命令的字符。
例如,如果我把: pipe ls -lt |猫Lebowski | cd ..
我如何让系统认识到这里有三个单独的命令行参数在不同的管道中表示。
答案 0 :(得分:2)
首先,因为管道是一个特殊的符号,你需要在传递给程序时将其转义:
pipe ls -lt \| cat Lebowski \| cd .. .
在您的主要功能中:
main(int argc, char *argv[]) {
argv
包含不同索引处的所有这些参数(ls,-lt,|,cat ...)。例如,argv[0]
为ls
,argv[2]
为'|'
。 argc
是此类参数的总数。
答案 1 :(得分:1)
getopt()
,您也可以将其用于此目的,并在此处记录getopt()
答案 2 :(得分:1)
strtok_r()
功能是你的朋友:
char **explode(char *s, const char *sep, size_t *outsz)
{
size_t allocsz = 4;
size_t sz = 0;
char **arr = malloc(allocsz * sizeof(*arr));
if (arr == NULL) {
*outsz = 0;
return NULL;
}
char *p, *end;
for (p = srtok_r(s, sep, &end); p; p = strtok_r(NULL, sep, &end)) {
if (++sz > allocsz) {
allocsz <<= 1;
arr = realloc(arr, sizeof(*arr) * allocsz));
assert(arr != NULL); // sorry
}
arr[sz - 1] = strdup(p);
}
*outsz = sz;
return arr;
}
用法:
int main()
{
char sentence[] = "The quick brown fox jumped over the lazy dog.";
size_t sz;
char **arr = explode(sentence, " ", &sz);
int i;
for (i = 0; i < sz; i++) {
printf("%s\n", arr[i]);
free(arr[i]);
}
free(arr);
return 0;
}
答案 3 :(得分:0)
自|对于大多数常见的shell来说,它是一个特殊字符,你需要引用它们(正如其他人所说)。如果引用双引号内的所有参数,例如
pipe“ls -lt | cat Lebowski | cd ..”
您可以使用argv[1]
解析strtok_r()
。