2014-01-23 2 views
0

나는 거기에 배열을 포함하는 명령을 가지고 있으며 Linux의 내 C 코드에서 popen을 사용합니다.popen을 사용하여 우분투에서 배열을 사용하면 작동하지 않습니다 (해결됨)

CentOS, Fedora, SUSE, Redhat에서 작동하지만 우분투에는 항상 구문 오류가 있습니다.

다음은 코드의 일부입니다.

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 : 구문 오류 : "("예상치 못한 (

) "완료"기대 내가 + = ..... T1 (R1)을 제거하면 + = ..... ., 그리고 내가 또한 스크립트로를 작성하려고합니다.

을 구문 검사를 통과 할 것이다, 그것은 작동합니다.

를 수행 누구나 알고있는 문제?

감사합니다.

답변

0

예. 우분투의 기본 쉘 (/bin/sh)은 bash이 아닌 dash입니다. 당신과 같이 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 
+0

를 출력 어느 당신은 비난하는 입력으로 명령을 공급해야합니다. 작성한 방법에 따라 '대시'는 '배시'가 종료 된 후에 해당 명령을 실행합니다. – Barmar

+0

왜'bash'가 아닌'/ usr/bin/env bash'를 사용해야합니까? 이것은'$ PATH'를 통해 명령을 찾으려면'#!'줄에서해야 할 일이지만'popen()'을 사용할 때는 필요하지 않습니다. – Barmar

+0

엘리엇, 안녕하세요. – sowrdking