Dlaczego wc <<< „$ string” pokazuje dłuższą o jeden bajt długość niż printf „$ string” | toaleta?


11

Przypadkowo odkryłem, że wcliczy się inaczej w zależności od tego, jak pobiera dane wejściowe z bash:

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

Czy to gdzieś udokumentowane zachowanie IMHO? Co się wctu liczy - czy to zakładana nowa linia?


3
Zawsze możesz potokować, od -caby zobaczyć dokładnie to, co masz.
Thorbjørn Ravn Andersen

Lub lepiej xxd -g1.
Ruslan

1
Mam nadzieję, że printf "$s"nie jest to twój skrypt ... mam nadzieję, że miałeś na myśliprintf "%s" "$s"
user541686 30.01.2018

Ponieważ było tak wiele komentarzy na temat printf, zredagowałem swój post, aby odzwierciedlić najlepsze praktyki.
rexkogitans

Odpowiedzi:


38

Różnica wynika z nowej linii dodanej do ciągu tutaj. Zobacz instrukcję Bash :

Wynik jest dostarczany jako pojedynczy ciąg z dołączonym znakiem nowej linii do polecenia na jego standardowym wejściu (lub deskryptorze pliku n, jeśli podano n ).

wc liczy się w ten sam sposób, ale jego dane wejściowe są inne.


7
Jeśli należy zauważyć, że w celu wydrukowania (dowolny) zawartość zmiennej bez dodanym znakiem nowego wiersza, powinna być printf %s "$var"(lub print -rn -- "$var"z podobnego muszli ksh), a nie printf "$var", które nie działają poprawnie dla wartości $var, które zawierają %lub znaki backslash (lub zacznij od -większości implementacji).
Stéphane Chazelas

Zauważ, że oryginalna implementacja ciągu znaków w porcie uniksowym rcnie dodawała tego znaku nowej linii.
Stéphane Chazelas

26

Jest to nowa linia dodana przez przekierowujący ciąg znaków:

$ 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.