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.