sh
difere de bash
e se comporta de maneira diferente.
Eu acho que sh
é realmente dash
.
BTW: há um comportamento diferente com este comando se você verificar diferentes shells.
bosh
, dash
, mksh
, zsh
bem como ksh
no Solaris imprimem uma barra invertida
bash
e ksh
no Linux imprimem duas barras invertidas.
Olhando para a saída $ shell -x, acredito que uma barra invertida é a saída correta.
Eu não tenho idéia do porquê ksh
se comporta dessa maneira no Linux. Pode ser que ele tente imitar o comportamento bash
.
Para bash
, o comportamento pode ser explicado: o bash tem um echo
não-POSIX que não interpreta backshlashes como requerido pelo POSIX.
O POSIX permite o comportamento de bash
apenas em pequenos sistemas embarcados e o POSIX requer as chamadas extensões XSI
a serem implementadas. Com echo
, isso requer seguir totalmente o comportamento de echo
, conforme implementado em 1982 por AT & T para SYSv.
Uma nota importante:
Se você tem um script que começa com
#!/bin/bash
e isso é executável ( x
bit definido por chmod
), e se você chamar
sh myscript
esse script ainda é executado por /bin/sh
, que normalmente é dash
no Linux. Portanto, tenha cuidado ao executar seu código.
Existe uma maneira de evitar o seu problema. Altere seu script para usar:
ch='echo "b_d" | sed 's/_/\\\\_/''
printf '%s\n' $ch
Dessa forma, você evita os problemas com echo
que foram introduzidos em 1989 com bash
. printf
ainda não resolve todos os problemas, pois há muitas implementações com bugs, mas os problemas comuns que surgem das barras invertidas nos argumentos não são afetados por printf
.