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