Perché wc <<< “$ string” mostra una lunghezza di un byte più lunga di printf “$ string” | bagno?


11

Accidentalmente, ho scoperto che wcconta in modo diverso a seconda di come ottiene l'input da bash:

$ s='hello'
$ wc -m <<<"$s"
6
$ wc -c <<<"$s"
6
$ printf '%s' "$s" | wc -m
5
$ printf '%s' "$s" | wc -c
5

Questo comportamento - IMHO confuso - è documentato da qualche parte? Cosa wcconta qui - si tratta di una presunta newline?


3
Puoi sempre convogliare per od -cvedere esattamente quello che hai.
Thorbjørn Ravn Andersen,

O, meglio, xxd -g1.
Ruslan,

1
Spero printf "$s"non sia il tuo vero copione ... speriamo che printf "%s" "$s"
volessi

Dato che c'erano così tanti commenti su printf, ho modificato il mio post per riflettere le migliori pratiche.
rexkogitans,

Risposte:


38

La differenza è causata da una nuova riga aggiunta alla stringa qui. Vedi il manuale di Bash :

Il risultato viene fornito come una singola stringa, con una nuova riga aggiunta, al comando sul suo input standard (o al descrittore di file n se viene specificato n ).

wc sta contando allo stesso modo, ma il suo input è diverso.


7
Se si deve notare che per stampare il contenuto (arbitrario) di una variabile senza un carattere di nuova riga aggiunto, dovrebbe essere printf %s "$var"(o print -rn -- "$var"con shell tipo ksh), non printf "$var"che non funzionerebbe correttamente per i valori di $varquel contenuto %o di barre rovesciate (o iniziare con la -maggior parte delle implementazioni).
Stéphane Chazelas,

Si noti che l'implementazione originale qui-stringa nella porta Unix di rcnon ha aggiunto quel carattere di nuova riga.
Stéphane Chazelas,

26

È una nuova riga successiva aggiunta dal redirector qui-stringa:

$ s="hello"
$ hexdump -C <<<"$s"
00000000  68 65 6c 6c 6f 0a                                 |hello.|
00000006
$ printf "$s" | hexdump -C
00000000  68 65 6c 6c 6f                                    |hello|
00000005
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.