Risposte:
La risposta semplice è perché ksh è scritto in questo modo (e bash è compatibile). Ma c'è una ragione per quella scelta di design.
La maggior parte dei comandi prevede l'immissione di testo. Nel mondo unix, un file di testo è costituito da una sequenza di linee, ognuna delle quali termina con una nuova riga . Quindi nella maggior parte dei casi è necessaria una nuova riga finale. Un caso particolarmente comune è quello di afferrare l'output di un comando con un comando suppbtitution, elaborarlo in qualche modo, quindi passarlo a un altro comando. La sostituzione del comando elimina le righe finali; <<<
rimette uno.
tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp
Bash e ksh non possono comunque manipolare i dati binari (non possono far fronte a caratteri null), quindi non sorprende che le loro strutture siano orientate verso i dati di testo.
La <<<
sintassi qui-string è per lo più solo per comodità comunque, come <<
i documenti here. Se non è necessario aggiungere una nuova riga finale, utilizzare echo -n
(in bash) oe printf
una pipeline.
<<<
è stato introdotto al mondo Bourne dai zsh
, non è ksh
. Ed è stato ispirato da un operatore simile nella porta Unix di rc
cui non ha aggiunto quel carattere extra newline. È interessante notare che l' =(<<<text)
operatore non aggiunge quella nuova riga in zsh
.
printf
, ecc.) Evitando la coda di coda bash
? Come @ StéphaneChazelas indicato è possibile in zsh
.
Uno scenario in cui è pratico aggiungere nuove righe alle stringhe qui è quando si utilizza il read
comando quando la set -e
modalità è attiva. Richiamo che set -e
provoca la chiusura di uno script quando (più o meno) incontra istruzioni che generano un codice di stato diverso da zero. Considera che read
genera un codice di stato diverso da zero quando incontra una stringa senza newline:
#!/bin/bash
set -e
# The following statement succeeds because here-strings append a newline:
IFS='' read -r <<< 'newline appended'
echo 'Made it here'
# The following statement fails because 'read' returns a non-zero status
# code when no newlines are encountered.
printf 'no newline' | IFS='' read -r
echo 'Did not make it here'
Penso che sia l'unico modo per ottenere una nuova riga alla fine di una stringa qui, prova:
xxd <<<`echo -ne "a\n"`
Sembrerebbe che l'operatore stringa qui spoglia le nuove righe a meno che non siano indicate nella sintassi che hai inviato.
xxd <<<$(echo a)
.