Por que wc “$ string” mostra um comprimento de um byte a mais que printf “$ string” | banheiro?

11

Acidentalmente, descobri que wc conta diferentemente dependendo de como ele recebe a entrada do bash:

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

É este comportamento - IMHO confuso - documentado em algum lugar? O que wc conta aqui - essa é uma nova linha assumida?

    
por rexkogitans 30.01.2018 / 13:26

2 respostas

38

A diferença é causada por uma nova linha adicionada à string here. Consulte o manual do Bash :

The result is supplied as a single string, with a newline appended, to the command on its standard input (or file descriptor n if n is specified).

wc está contando da mesma maneira, mas sua entrada é diferente.

    
por 30.01.2018 / 13:30
26

É uma nova linha subsequente adicionada pelo redirecionador here-string:

$ 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
    
por 30.01.2018 / 13:31