c - 在 ubuntu 中使用数组与 popen 不起作用

标签 c arrays ubuntu popen

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

它可以在centOS、Fedora、open SU​​SE、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/

相关文章:

c - 从C中的动态数组中的特定位置删除元素

java - 如果大小未知,如何在 java 中使用 char 数组?

ubuntu - Pycharm:如何使用在 Ubuntu 中安装的字体

c - jinclude.h :20:55: fatal error: jconfig. h: 没有那个文件或目录

c++ - 为什么我要启动一个线程 "suspended"?

python - Psycopg2 --- 插入数组

arrays - 在 Swift 中修改数组项

mysql - 如何设置 mysql (@Ubuntu-Server) 自动连接到其他主机?

ubuntu - 通过 ssh 改进开发?

c - 为什么 -- 运算符在执行时不从值中减去?