bash 脚本上的 C++ system() 与 at 的执行方式不同

bash 脚本上的 C++ system() 与 at 的执行方式不同

C++ 脚本,编译为g++ -std=c++11

   #include <iostream>

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

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系统并按原样打印 ,因为该系统不知道是什么。通过系统使用时的情况相同。您可能会考虑更好的可移植性,或者避免尴尬的调用,而只是 fork/exec 并直接写入。/bin/echo-eecho-ebash/bin/echoprintfshat

相关内容