C ++ system () no script bash com at executa de forma diferente

0

Script C ++, compilado com g++ -std=c++11

   #include <iostream>

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

Script de bash

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

com <EOT> significando o caractere \ x04

em C ++, a última linha parece com "echo -e \"echo \\"$STRING\\" >> output.txt\n\x04\" | at $TIME"

A diferença entre os dois métodos de chamar ./temp.bash (chamando script C ++ compilado vs chamando diretamente da linha de comando) é que o -e sinalizador é gravado no arquivo /atjobs no início da linha quando chamado via C ++.

Isso parece um erro. Por que isso acontece?

    
por TheZouave 09.06.2017 / 03:54

1 resposta

3

echo não é portátil; o bash builtin echo difere daquele do sistema /bin/echo binary. Despojado das complicações da chamada at e outras coisas que observamos

$ 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
$ 

O system em C ++ (ou também C) chama sh , o que (provavelmente) não tem echo embutido e, portanto, o sistema /bin/echo é usado e -e é impresso como está, porque esse sistema echo não tem ideia do que é -e . Mesma história quando via bash o sistema /bin/echo é usado. Você pode considerar em vez de printf para melhor portabilidade, ou para evitar sh de chamadas estranhas e, em vez disso, apenas fork / exec e gravar em at diretamente.

    
por 09.06.2017 / 04:20