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


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'

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


5

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

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

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

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.