我有一个包含数组的命令,我在 Linux 的 C 代码中使用了 popen。
它可以在centOS、Fedora、open SUSE、Redhat上运行,但在Ubuntu上总是出现语法错误。
这是部分代码。
fp = popen("counter=0;network=$(ls /sys/class/net);num_re=\"^[0-9]+$\";"
"for i in $network;"
"do"
" recv=$(cat /sys/class/net/$i/statistics/rx_bytes) trans=$(cat /sys/class/net/$i/statistics/tx_bytes)"
" r1+=(\"$recv\") t1+=(\"$trans\");"
"done;","r");
它会说 -> sh: 1: 语法错误:“(”意外(期望“完成”)
如果我删除 r1+=..... t1+=......,它将通过语法检查。
我也尝试将其写入脚本中,并且它有效。
有人知道这个问题吗?
谢谢。
最佳答案
是的。因为 Ubuntu 的默认 shell (/bin/sh
) 是 dash而不是 bash。您可以像这样使用 bash
-
#include <stdio.h>
int main () {
FILE *fp;
char *cmd = "bash -c 'counter=0;network=$(ls /sys/class/net);"
"num_re=\"^[0-9]+$\";for i in $network;do"
" recv=$(cat /sys/class/net/$i/statistics/rx_bytes) "
"trans=$(cat /sys/class/net/$i/statistics/tx_bytes)"
" r1+=(\"$recv\") t1+=(\"$trans\");" "done; echo $r1 $t1'";
fp = popen (cmd, "r");
while (1) {
int c = fgetc (fp);
if (c == '\0' || feof(fp)) {
break;
}
printf ("%c", c);
}
}
哪些输出
$ sudo ifconfig eth0 up
$ ./a.out
0 0
$ ./a.out
289 762
$ uname -a
Linux eeyore 3.8.0-35-generic #50-Ubuntu SMP Tue Dec 3 01:24:59 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
关于c - 在 ubuntu 中使用数组与 popen 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21297671/