A seguinte sequência de comandos
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
echo $ch
quando executado em um terminal ou via source
dar uma saída
b\\_d
Quando correu como um scipt
sh script.sh
onde o conteúdo do script é:
#!/bin/bash
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
echo $ch
a saída é
b\_d
A saída do terminal é a preferida. Qual é a solução para usar o script de shell? Também aceitas como respostas são ideias de como modificar
ch=`echo "b_d" | sed 's/_/\\\\\\\\_/'`
para sh
.
Eu uso o shell bash:
echo $0
bash
sh
diferebash
e se comporta de maneira diferente.Eu acho que
sh
é realmentedash
.BTW: há um comportamento diferente com este comando se você verificar shells diferentes.
bosh
,dash
,mksh
,zsh
bem comoksh
no Solaris imprime uma barra invertidabash
eksh
no Linux imprima duas barras invertidas.Observando a saída $shell -x, acredito que uma barra invertida seja a saída correta.
Eu não tenho idéia por que
ksh
se comporta dessa maneira no Linux. Pode ser que ele tente imitar obash
comportamento.Para
bash
o comportamento pode ser explicado: o bash tem um não POSIXecho
que não interpreta as barras invertidas conforme exigido pelo POSIX.O POSIX permite o comportamento de
bash
apenas em pequenos sistemas embarcados e o POSIX exige que as chamadasXSI
extensões sejam implementadas. Comecho
o , isso exige seguir integralmente o comportamentoecho
implementado em 1982 pela AT&T para o SYSv.Uma observação importante:
Se você tiver um script que comece com
e isso é executável (
x
bit definido porchmod
), e se você chamarsh meu script
esse script ainda é executado pelo
/bin/sh
que normalmente édash
no Linux. Portanto, tenha cuidado em como você executa seu código.Existe uma maneira de evitar o seu problema. Altere seu script para usar:
Dessa forma, você evita os problemas
echo
que foram introduzidos em 1989 com obash
.printf
ainda não resolve todos os problemas, pois existem muitas implementações com bugs, mas os problemas usuais que surgem das barras invertidas nos argumentos não são afetados peloprintf
.