Eu tenho o script bash que tem muitas echo
instruções e também tenho um alias echo
para echo -e
ambos em .bash_profile
e .bashrc
, para que novas linhas sejam impressas corretamente para uma declaração como echo 'Hello\nWorld'
a saída deve ser
Hello
World
mas a saída que estou recebendo é
Hello\nWorld
Eu até tentei usar shopt -s expand_aliases
no script, não ajuda
Estou executando meu script como bash /scripts/scriptnm.sh
; se eu executá-lo como . /scripts/scriptnm.sh
estou obtendo a saída desejada ...
echo
como você quer é uma prática IMHO ruimRespostas:
O histórico misto de
echo
significa que sua operação padrão varia de shell para shell. POSIX especifica que o resultado deecho
é "definido pela implementação" se o primeiro argumento for-n
ou qualquer argumento contiver uma barra invertida.É mais confiável usar
printf
(como um comando interno ou externo) onde o comportamento é mais bem definido: a barra invertida no estilo C escapa e os especificadores de formato são suportados na cadeia de caracteres de formato (o primeiro argumento).Você pode controlar a expansão da barra invertida escapar seqüências de festa ‘s
echo
comando built-in com axpg_echo
opção de shell.Defina-o na parte superior de qualquer script bash para fazer com que
echo
a barra invertida expanda automaticamente sem precisar adicionar-e
a cada comando de eco.fonte
Quando você usa
bash myfile.sh
, o Bash é executado no modo "lote", em um processo separado , e não lê seu perfil ou rcfile.Quando você usa
. myfile.sh
, o arquivo é originado pelo processo atual do shell (como se seu conteúdo tivesse sido digitado por você); portanto, ele vê seus aliases atualmente definidos.Em geral, é uma péssima idéia escrever scripts que dependam de qualquer configuração de shell específica, especialmente aliases, a menos que você os defina no próprio script . ( Nunca confie no usuário
.bashrc
, mesmo que seja seu.)fonte
A prática recomendada é usar
printf
para todos os novos scripts.fonte
Isso funciona bem no terminal
salvar em um arquivo e torná-lo executável (chmod + x)
executar como ./seu_arquivo
fonte