Se ho il file input.txt
contenente:
hello
world
!
Quindi eseguendo il comando bash echo $(cat input.txt)
verrà generato questo:
hello world !
Perché e come posso risolverlo per generare esattamente ciò che è nel file come è nel file?
Se ho il file input.txt
contenente:
hello
world
!
Quindi eseguendo il comando bash echo $(cat input.txt)
verrà generato questo:
hello world !
Perché e come posso risolverlo per generare esattamente ciò che è nel file come è nel file?
Risposte:
Se usi
echo "$(cat input.txt)"
funzionerà correttamente.
Probabilmente l'input di eco è separato da newline e lo gestirà come comandi separati, quindi il risultato sarà senza newline.
echo "$(date) something"
rimuovere la nuova riga finale dall'output della data, facendo in modo che l'eco produca la data e "qualcosa" sulla stessa riga. Se è necessario memorizzare un file o l'output del comando "così com'è", utilizzare mapfile ( help mapfile
) read -rd ''
o un ciclo di lettura while.
Citato dalla pagina del manuale di bash, sezione Command Substitution
:
Le nuove righe incorporate non vengono eliminate, ma possono essere rimosse durante la divisione delle parole.
Un po 'più avanti, stessa sezione:
Se la sostituzione appare tra virgolette doppie, la divisione delle parole e l'espansione del percorso non vengono eseguite sui risultati.
Ecco perché echo "$(cat /etc/passwd)"
funziona.
Inoltre, si dovrebbe essere consapevoli del fatto che la sostituzione dei comandi secondo le specifiche POSIX rimuove le nuove righe finali:
$ echo "$(printf "one\ntwo\n\n\n")"
one
two
Pertanto, l'output di un file tramite $(cat file.txt)
può portare alla perdita di nuove righe finali e ciò può costituire un problema se l'integrità dell'intero file è prioritaria.
È possibile conservare le nuove righe, ad esempio impostando IFS su vuoto:
$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3