Wc <<< “$ string” neden printf “$ string” den bir bayt daha uzun uzunluk gösteriyor | tuvalet?


11

Yanlışlıkla, wcbash'tan girişi nasıl aldığına bağlı olarak farklı sayıldığını öğrendim :

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

Bu - IMHO kafa karıştırıcı - davranış bir yerde belgelenmiş mi? wcBurada ne var - bu varsayılan bir satırsonu mu?


3
od -cTam olarak neye sahip olduğunuzu görmek için her zaman boru oluşturabilirsiniz .
— Thorbjørn Ravn Andersen

Veya daha iyi xxd -g1.
— Ruslan

1
Umarım printf "$s"gerçek senaryon değil ... umarım demek printf "%s" "$s"
— istedin

Printf hakkında çok fazla yorum yapıldığı için yazımı en iyi uygulamayı yansıtacak şekilde düzenledim.
— rexkogitans

Yanıtlar:


38

Fark, burada dizeye eklenen bir yeni satırdan kaynaklanır. Bash kılavuzuna bakın :

Sonuç satır eklenmiş olan standart girişindeki komuta, tek bir dize olarak verilir (veya dosya tanımlayıcı n ise n belirtilir).

wc aynı şekilde sayıyor, ancak girdisi farklı.


7
Ek bir satır karakteri olmadan değişkenin (keyfi) içeriği yazdırmak için belirtmek gerekir ise, olması gerektiği printf %s "$var"(veya print -rn -- "$var"kabukları benzeri ksh ile) değil, printf "$var"hangi değerleri için doğru işe yaramaz $variçerirler %veya ters eğik çizgi karakterleri (veya -çoğu uygulama ile başlayın ).
— Stéphane Chazelas

Unix bağlantı noktasındaki özgün burada dize uygulamasının rcbu satırsonu karakterini eklemediğini unutmayın.
— Stéphane Chazelas

26

Burada dizge yeniden yönlendiricisi tarafından eklenen başarılı bir satırsonu:

$ 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.