\
é usado para escapar de alguns caracteres (como \
, "
, $
, '
) e remover caracteres de nova linha entre aspas duplas, então
sh -c "echo \a\\\b\;\c"
é como
sh -c 'echo \a\\b\;\c'
Para esse sh, \
é usado para escapar de todos os caracteres, então torna-se o mesmo que
echo 'a\b;c'
Em conformidade com UNIX echo
s expanda \b
em um caractere de retrocesso ( ^H
) que, quando enviado para um terminal, move o cursor um caractere para a esquerda, então ;
sobrescreve o a
, e é por isso que você vê ;c
.
echo
é um comando não portátil cujo comportamento varia muito de shell para shell e de sistema para sistema. É melhor evitar especialmente se receber argumentos que possam conter barras invertidas ou começar com um traço. Use printf em vez disso.
sh -c 'printf "%s\n" "a\\b;c"'
para gerar a\b;c
.
(3 barras invertidas seriam suficientes, mas é mais seguro lembrar que, entre aspas duplas, você precisa de duas barras invertidas para obter uma).
Para implementações echo
que expandem sequências de escape como a sua, você teria que dobrar o número de barras invertidas.
sh -c 'echo "a\\\\b;c"'
Se você quiser evitar as aspas duplas, só precisará escapar do caractere ;
, que é o único especial para o shell (além de \
, que você já escapou no double-end). versão da citação).
sh -c 'echo a\\\\b\;c'
Se você quiser usar aspas duplas em vez de aspas simples, novamente terá que dobrar o número de barras invertidas.
sh -c "echo a\\\\\\\\b\;c"
E se você quiser se livrar das aspas, você precisa escapar do espaço e ;
novamente para a camada externa.
sh -c echo\ a\\\\\\\\b\\;c