Perché bash rimuove \ n in $ (cat file)?

21

Se ho il file input.txt contenente:

hello
world
!

Quindi eseguendo il comando bash echo $(cat input.txt) verrà emesso questo:

hello world !

Perché e come posso correggerlo per produrre esattamente ciò che è nel file come è nel file?

    
posta f.ardelian 14.04.2012 - 03:58

2 risposte

24

Se usi

echo "$(cat input.txt)"

funzionerà correttamente.

Probabilmente l'input di echo è separato da newline e lo gestirà come comandi separati, quindi il risultato sarà senza newline.

    
risposta data arian 14.04.2012 - 04:10
0

Citato dalla pagina di manuale di bash, sezione Command Substitution :

  

Le nuove righe incorporate non vengono cancellate, ma possono essere rimosse durante   divisione delle parole.

Un po 'più avanti, stessa sezione:

  

Se la sostituzione appare tra virgolette, divisione parole e   l'espansione del percorso non viene eseguita su          i risultati.

Ecco perché echo "$(cat /etc/passwd)" funziona.

Inoltre, si dovrebbe essere consapevoli che la sostituzione di comando in base alle specifiche POSIX rimuove il trascinamento nuove righe:

$ echo "$(printf "one\ntwo\n\n\n")"
one
two

Quindi, l'output di un file tramite $(cat file.txt) può portare alla perdita di righe nuove finali e questo può essere un problema se l'integrità di tutto il file è prioritaria.

    
risposta data Sergiy Kolodyazhnyy 06.04.2016 - 18:16

Leggi altre domande sui tag