在ubuntu中使用数组与popen将无法正常工作

时间:2014-01-23 01:36:09

标签: c arrays ubuntu popen

我有一个包含数组的命令,我在Linux的c代码中使用了popen。

它适用于centOS,Fedora,开放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 + = ......,它将通过语法检查。

我也尝试将其写入脚本,它可以工作。

有人知道这个问题吗?

感谢。

1 个答案:

答案 0 :(得分:0)

是。因为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