echo caractere de nova linha não está funcionando no bash

12

Eu tenho um script bash com muitas instruções echo e também alias echo to echo -e 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 executar como . /scripts/scriptnm.sh estou recebendo a saída desejada ...

    
por Bashuser 11.03.2011 / 21:56

4 respostas

15

O histórico misto de echo significa que sua operação padrão varia de shell para shell. POSIX especifica que o resultado de echo é "implementado-definido" se o primeiro argumento for -n ou qualquer argumento contém uma barra invertida.

É mais confiável usar printf (como um comando interno ou um comando externo) onde o comportamento é mais bem definido: a barra invertida no estilo C escapa e os especificadores de formato são suportados na string de formato (o primeiro argumento).

printf 'foo\nbar\n'
printf '%s\n%s\n' foo bar

Você pode controlar a expansão de sequências de escape de barra invertida do comando interno echo do bash com a opção xpg_echo shell.

Defina-o na parte superior de qualquer script bash para que echo expanda automaticamente as saídas de barra invertida sem precisar adicionar -e a cada comando de eco.

shopt -s xpg_echo
echo 'foo\nbar'
    
por 11.03.2011 / 23:26
5

A prática recomendada é usar printf para todos os novos scripts.

printf '%s\n%s\n' "Hello" "World"

printf '%s\n' "Hello\nWorld"
    
por 11.03.2011 / 22:37
5

Quando você usa bash myfile.sh , o Bash é executado no modo "batch", em um processo separado , e não lê seu perfil ou arquivo rc.

Quando você usa . myfile.sh , o arquivo é originado pelo processo shell atual (como se o seu conteúdo fosse digitado por você), portanto ele vê seus aliases definidos atualmente.

Em geral, é uma idéia muito ruim escrever scripts que dependam de qualquer configuração de shell em particular, especialmente aliases, a menos que você os defina no próprio script. ( Nunca confie no .bashrc do usuário, mesmo que seja o seu próprio.)

    
por 11.03.2011 / 22:25
1

Isso funciona bem no terminal

#!/bin/bash
alias echo="echo -e"
echo "Hello\nWorld"

salve em um arquivo e torne-o exeutable (chmod + x)

execute como ./seu_file

    
por 11.03.2011 / 22:05