Não é o read
, mas o echo
.
I wrote a
script.sh
and invoked it usingsh script.sh
.
No Debian e no Ubuntu, sh
é dash
, em que echo
avalia escapes de barra invertida no estilo C em seus argumentos:
$ dash -c 'foo="foo$ dash -c 'foo="foo%pre%0bar"; echo "$foo"; printf "%s\n" "$foo"'
foo
foo%pre%0bar
0bar"; echo "$foo"; printf "%s\n" "$foo"'
foo
foo%pre%0bar
O
é transformado no byte NUL, que aparentemente termina a cadeia que echo
0echo
produz. Citando a variável não ajuda aqui, já que ela apenas altera o processamento da linha de comando do shell antes do próprio comando ser executado, e aqui está o echo
em si que lida com as barras invertidas.
Este é um problema de portabilidade conhecido, descrito em mais detalhes aqui: Por que printf melhor que echo?
Por exemplo, -e
do Bash faz o processamento de contrabarra se receber o argumento bash script.sh
.
A pergunta foi marcada originalmente com bash , portanto, se você quiser execute o script usando o Bash, execute-o com sh script.sh
, não %code% .