wc <<<“ $ string”がprintf“ $ string”よりも1バイト長い長さを表示するのはなぜですか| トイレ?


11

偶然にも、wcそれがbashから入力を取得する方法に応じてカウントが異なることがわかりました。

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

これは-私見が混乱する-どこかに文書化された行動ですか?wcここで何を数えますか?これは想定される改行ですか?


3
いつでもパイプを使用od -cして、所有しているものを正確に確認できます。
–ThorbjørnRavn Andersen 2018

または、より良いxxd -g1
ルスラン

1
printf "$s"はあなたの実際のスクリプトではないことを願っています...願わくばprintf "%s" "$s"
user541686

printfについては非常に多くのコメントがあったため、ベストプラクティスを反映するように投稿を編集しました。
rexkogitans 2018年

回答:


38

この違いは、here文字列に改行が追加されたために発生します。Bashのマニュアルを参照してください。

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

wc 同じ方法でカウントしていますが、その入力は異なります。


7
改行文字を追加せずに変数の(任意の)内容を出力するには、それはprintf %s "$var"(またはprint -rn -- "$var"kshのようなシェルで)必要があります。printf "$var"これは、$varその%文字を含む値またはバックスラッシュ(-ほとんどの実装から始めます)。
ステファンChazelas

Unixポートの元のhere-string実装では、rcその改行文字が追加されなかったことに注意してください。
ステファンChazelas

26

これは、ヒアストリングリダイレクタによって追加された後続の改行です。

$ 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.