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
2つの呼び出し方法(コンパイルされた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