bash 스크립트의 C++ system()은 at과 다르게 실행됩니다.

bash 스크립트의 C++ system()은 at과 다르게 실행됩니다.

C++ 스크립트는 다음과 같이 컴파일됩니다.g++ -std=c++11

   #include <iostream>

    int main() {
        system("./temp.bash");
    }

배쉬 스크립트

    TIME="now +1 minutes"
    STRING="Output File Test 7 SUCCESS!!!"
    echo -e "echo \"$STRING\" >> output.txt
    <EOT>" | at $TIME

<EOT>문자 \x04를 나타냅니다 .

C++에서 마지막 줄은 다음과 같습니다."echo -e \"echo \\\"$STRING\\\" >> output.txt\n\x04\" | at $TIME"

./temp.bash두 가지 호출 방법(컴파일된 C++ 스크립트 호출과 명령줄에서 직접 호출)의 차이점은 C++에서 호출할 때 -e플래그가 /atjobs파일의 줄 시작 부분에 기록된다는 것입니다.

이것은 버그인 것 같습니다. 왜 이런 일이 발생합니까?

답변1

echo이식성이 없습니다. 내장 바이너리와 시스템 바이너리 bash는 다릅니다. 우리가 관찰한 통화 및 기타 상황의 복잡성을 제거합니다.echo/bin/echoat

$ sh -c 'echo -e "echo hi"'
-e echo hi
$ bash -c 'echo -e "echo hi"'
echo hi
$ bash -c '/bin/echo -e "echo hi"'
-e echo hi
$ 

systemC++(또는 C)에서의 호출( sh아마도)에는 내장 함수가 없으므로 echo시스템을 사용하고 그대로 인쇄하십시오. 시스템은 그것이 무엇인지 모르기 때문입니다. 시스템을 통해 사용하는 경우에도 마찬가지입니다. 더 나은 이식성을 고려하거나 어색한 호출을 피하고 분기/실행하고 직접 작성할 수 있습니다./bin/echo-eecho-ebash/bin/echoprintfshat

관련 정보