Perché una stringa qui bash aggiunge un carattere newline finale?


34

Gli esempi seguenti mostrano che una nuova riga viene aggiunta a una stringa qui .
Perché è fatto?

xxd -p <<<'a'  
# output: 610a

xxd -p <<<'a
'
# output: 610a0a

Risposte:


38

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


Molto più approfondito della mia risposta.
Mike,

2
Bash potrebbe aver preso in prestito stringhe qui da ksh93, ma a sua volta ksh le prese in prestito da zsh, che le ottenne dalla shell rc Plan 9 .
Mark Reed,

2
<<<è stato introdotto al mondo Bourne dai zsh, non è ksh. Ed è stato ispirato da un operatore simile nella porta Unix di rccui non ha aggiunto quel carattere extra newline. È interessante notare che l' =(<<<text)operatore non aggiunge quella nuova riga in zsh.
Stéphane Chazelas,

Se ti chiedi l'interesse per questa risposta è a causa di questa domanda in SO .
fedorqui,

1
C'è un modo per scrivere la stringa qui (senza usare altre utility come printf, ecc.) Evitando la coda di coda bash? Come @ StéphaneChazelas indicato è possibile in zsh.
CTodea,

3

Uno scenario in cui è pratico aggiungere nuove righe alle stringhe qui è quando si utilizza il readcomando quando la set -emodalità è attiva. Richiamo che set -eprovoca la chiusura di uno script quando (più o meno) incontra istruzioni che generano un codice di stato diverso da zero. Considera che readgenera 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'

-3

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.


4
È la sostituzione del comando che sta eliminando la nuova riga finale. Potresti semplificarlo a xxd <<<$(echo a).
Gilles 'SO- smetti di essere malvagio' il
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.