o caractere de nova linha de eco não funciona no bash

12

Eu tenho o script bash que tem muitas echoinstruções e também tenho um alias echopara echo -eambos em .bash_profilee .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_aliasesno script, não ajuda

Estou executando meu script como bash /scripts/scriptnm.sh; se eu executá-lo como . /scripts/scriptnm.shestou obtendo a saída desejada ...

Bashuser
fonte
3
aliasing echocomo você quer é uma prática IMHO ruim
shellholic
1
Use aspas duplas para que \ n seja interpretado. Aspas simples impedem a interpretação de \ n e várias outras coisas.
BillThor

Respostas:

15

O histórico misto de echosignifica que sua operação padrão varia de shell para shell. POSIX especifica que o resultado de echoé "definido pela implementação" se o primeiro argumento for -nou 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).

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

Você pode controlar a expansão da barra invertida escapar seqüências de festa ‘s echocomando built-in com a xpg_echoopção de shell.

Defina-o na parte superior de qualquer script bash para fazer com que echoa barra invertida expanda automaticamente sem precisar adicionar -ea cada comando de eco.

shopt -s xpg_echo
echo 'foo\nbar'
Chris Johnsen
fonte
shopt -s xpg_echo; Trabalhou para mim.
Bashuser
6

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.)

gravidade
fonte
5

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

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

printf '%s\n' "Hello\nWorld"
Dennis Williamson
fonte
O +1 printf é um pouco mais complicado de usar do que o eco, mas é mais do que útil em evitar as inconsistências do eco.
Gordon Davisson
1

Isso funciona bem no terminal

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

salvar em um arquivo e torná-lo executável (chmod + x)

executar como ./seu_arquivo

LaLeX
fonte
execute-o como bash your_file e verifique a saída.
Bashuser
Funciona conforme o esperado
LaLeX 11/03/11
mas o eco "Hello \ nWorld" não está mostrando a saída esperada. Como eco já é alias a ecoar -e deveria, mas que não está funcionando e isso é a minha pergunta
Bashuser
Desde que é má prática para echo apelido (programas que dependem dele pode quebrar), você deve remover o alias e em sua busca roteiro para o final echo substituí-lo por echo -e
Lalex
Muito obrigado Lalex por suas respostas, existe uma maneira que eu possa atingir o resultado esperado com o alias que ele não é uma boa prática
Bashuser