2017-01-13 2 views
1

이 예제와 비슷한 코드를 사용하여 C++에서 Linux 셸 명령으로 결과를 얻었습니다. 그것은 기본 명령으로 잘 작동하는 것 같습니다. 그러나, 나는 쉘 오류의 예에서 명령을 실행하려고 : 예기치 않은 토큰 근처의 구문 오류 '(' C++에서 복잡한 셸 명령을 실행하는 적절한 방법은 무엇입니까?

#include <stdio.h> 
#include <iostream> 

int main(int argc, char *argv[]) { 

    std::string cmdString = "cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | " 
          "awk -v RS=\"\" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) }' 2>&1"; 

    std::string result, file; 
    FILE *stream; 

    std::cout << "cmdString = " << cmdString << std::endl; 

    stream = popen(cmdString.c_str(), "r"); 

    char buffer[256]; 
    if(fgets(buffer, sizeof(buffer), stream) != NULL) { 
     file = buffer; 
     result += file.substr(0, file.size() - 1); 
    } 
    pclose(stream); 

    std::cout << "result = " << result << std::endl; 

    return 0; 
} 

내가 뭔가 잘못하고 있는가 어떻게 든 문자열을 포맷해야합니까?

+1

"내가 잘못하고 있니?" - 당신이 껍데기를 부르는 단순한 사실에 근거하여 '예'라고 말하고 싶습니다. 이것만으로도 거대한 경종을 울리고 많은 붉은 깃발이 생깁니다. * 적어도 * * 매우 신중하게 - 입력 된 args를 신중하게 검사하고, 환경이 정상적으로 작동하는지 확인하고, 오류를 확인하고, 사용자가 의도 한 실행 파일을 실행하는지 확인하는 등의 작업을 수행해야합니다. –

+2

명령 자체가 쉘에서 작동합니까? – Drop

+0

여기에서 읽기 시작하십시오 : http://man7.org/linux/manage/man2/pipe.2.html –

답변

3

당신은 당신의 명령 줄에서 bash - 특정 구조를 사용하는 popen의 인수가 bin/sh가 아닌 사용자의 현재 쉘에 전달되는 POSIX의 의무를

를 다음 중 하나를 수행 할 수 있습니다 문제를 해결하려면 :..

  1. /bin/sh- 호환 명령을 다시 작성하십시오.
  2. 명시 적으로 명령 줄에서 bash을 사용
    std::string cmdString = "bash -c \".....\"";
  3. 드롭 전부 쉘과 파이프 라인을 직접 구현한다.
관련 문제