echo carattere di nuova riga che non funziona in bash


13

Ho script bash che ha un sacco di echodichiarazioni e anche io alias echoper echo -esia in .bash_profilee .bashrc, in modo che le nuove linee sono stampate correttamente per una dichiarazione come echo 'Hello\nWorld'l'uscita dovrebbe essere

Hello
World

ma l'output che sto ottenendo è

Hello\nWorld

Ho anche provato a usare shopt -s expand_aliaseslo script, non aiuta

Sto eseguendo la mia sceneggiatura come bash /scripts/scriptnm.sh; se lo eseguo come . /scripts/scriptnm.shsto ottenendo l'output desiderato ...


3
aliasing echocome vuoi è una cattiva pratica IMHO
shellholic

1
Usa virgolette doppie per interpretare \ n. Le virgolette singole impediscono l'interpretazione di \ n e un sacco di altre cose.
BillThor,

Risposte:


16

La storia mista di echosignifica che le sue operazioni predefinite variano da shell a shell. POSIX specifica che il risultato di echoè "definito dall'implementazione" se il primo argomento è -no qualsiasi argomento contiene una barra rovesciata.

È più affidabile da usare printf(come comando incorporato o comando esterno) in cui il comportamento è più ben definito: la barra rovesciata in stile C e gli identificatori di formato sono supportati nella stringa di formato (il primo argomento).

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

È possibile controllare l'espansione delle sequenze di escape backslash di bash ‘s echocomando integrato con l' xpg_echoopzione di shell.

Impostalo nella parte superiore di qualsiasi script bash per fare in modo che echole escape backslash si espandano automaticamente senza dover aggiungere -ead ogni comando echo.

shopt -s xpg_echo
echo 'foo\nbar'

shopt -s xpg_echo; Ha funzionato per me.
Bashuser

6

Quando si utilizza bash myfile.sh, Bash viene eseguito in modalità "batch", su un processo separato , e non legge il suo profilo o rcfile.

Quando lo usi . myfile.sh, il file proviene dall'attuale processo di shell (come se il suo contenuto fosse stato digitato da te), quindi vede i tuoi alias attualmente definiti.

In generale, è una pessima idea scrivere script che dipendono da una particolare configurazione della shell, in particolare alias, a meno che non vengano definiti nello script stesso. ( Non fare mai affidamento sull'utente .bashrc, anche se è tuo.)


5

La pratica consigliata è utilizzare printfper tutti i nuovi script.

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

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

+1 printf è un po 'più complicato da usare rispetto all'eco, ma ripaga più che altro evitando le incoerenze dell'eco.
Gordon Davisson,

1

Funziona bene nel terminale

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

salvare in un file e renderlo eseguibile (chmod + x)

eseguito come ./your_file


eseguilo come bash your_file e controlla l'output.
Bashuser,

Funziona come previsto
LaLeX

ma l'eco "Hello \ nWorld" non mostra l'output previsto. Poiché l'eco è già aliasato per l'eco, dovrebbe, ma non funziona e questa è la mia domanda
Bashuser,

Dal momento che è una cattiva pratica alias echo (i programmi che dipendono da esso potrebbero rompersi) è necessario rimuovere l'alias e nella ricerca di script per l'eco fine sostituirlo con echo -e
LaLeX

Grazie mille LaLex per le tue risposte, c'è un modo per ottenere il risultato atteso con l'alias anche se non è una buona pratica
Bashuser
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.