wc <<<"$string"がprintf "$string"トイレより1バイト長く表示されるのはなぜですか?

wc <<<"$string"がprintf "$string"トイレより1バイト長く表示されるのはなぜですか?

wc偶然bashから入力を取得する方法によって数が異なることがわかりました。

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

これは - IMHOの混乱 - 行動はどこかに文書化されていますか?ここでの取引は何ですかwc?これは仮定された改行ですか?

答え1

違いは、ここで文字列に追加された改行が原因です。バラよりバッシュマニュアル:

結果は、標準入力(またはファイル記述子)のコマンドに改行文字が追加された単一の文字列として提供されます。NもしN指定)。

wc計算方法は同じですが、入力が異なります。

答え2

これは、文字列リダイレクタによってここに追加された後続の改行です。

$ 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

関連情報