Caracteres de escape da shell para sh -c

2

Eu preciso executar um comando com argumento (s) de escape usando sh -c. Eu sei que a string parece bem feia, mas as simples não causam nenhum problema.

A saída do echo quando passada para sh -c é diferente do que quando a execução é independente e estou lutando para descobrir como corrigi-lo.

Antecedentes: [1] Estou escapando dos argumentos para o comando echo desde que isso é passado e eu queria ter certeza de que o comando extra não foi inserido. [2] Estou usando sh -c como queria ter a capacidade de usar recursos de shell como | ou nohup etc. [3] Provavelmente não relevante, mas isso está sendo executado através de uma conexão ssh com um servidor remoto.

O comando e a saída do comando sh -c são:

sh -c "echo \a\\\b\;\c"

;c

O comando e a saída do comando stand alone são:

echo \a\\\b\;\c

a\b;c

Qualquer ajuda seria muito apreciada!

    
por Stuart 06.12.2012 / 22:44

1 resposta

2

\ é 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
    
por 06.12.2012 / 22:56