Neden bir bash burada-string izleyen bir newline char ekler?


34

Aşağıdaki örnekler, burada yeni bir satır eklendiğini göstermektedir .
Bu neden yapılır?

xxd -p <<<'a'  
# output: 610a

xxd -p <<<'a
'
# output: 610a0a

Yanıtlar:


38

Kolay cevap şu ki, ksh bu şekilde yazılmıştır (ve bash uyumludur). Ancak bu tasarım tercihinin bir nedeni var.

Çoğu komut metin girişi bekler. Unix dünyasında, bir metin dosyası, her biri yeni bir satırda biten bir dizi diziden oluşur . Bu yüzden çoğu durumda son bir yeni satır gereklidir. Özellikle yaygın bir durum, bir komutun çıktısını bir komut şüphesiyle almak, bir şekilde işlemden geçirmek ve başka bir komuta iletmektir. Komut ikame işlemi son yeni satırları çıkarır; <<<birini geri koyar.

tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp

Bash ve ksh ikili verileri yine de değiştiremezler (boş karakterlerle baş edemezler), bu nedenle tesislerinin metin verilerine yönelik olması şaşırtıcı değildir.

<<<Burada telli sözdizimi gibi, yine sadece kolaylık çoğunlukla <<burada-belgeler. Son bir yeni satır eklemeniz gerekmiyorsa echo -n(bash cinsinden) veya printfbir boru hattı kullanın.


Cevabımdan çok daha kapsamlı.
Mike,

2
Bash ksh93 buraya-dizeleri ödünç olabilir ama sırayla Ksh Plan 9 kabuk dışarıdan temin etti zsh, onları ödünç rc .
Mark Reed,

2
<<<Bourne dünyasına zshdeğil , tanıtıldı ksh. Ve bunun Unix limanında benzer operatör esinlenerek rcyaptım hangi değil bu ekstra satır karakteri ekleyin. İlginçtir ki, =(<<<text)operatör bu yeni satırı eklenmez zsh.
Stéphane Chazelas,

Bu cevaba olan ilgiyi merak ediyorsanız , SO'daki bu sorudan kaynaklanıyor .
fedorqui

1
Burada printfyeni bir satır yazmamak için here-string'i yazmanın bir yolu var mı bash? @ StéphaneChazelas'ın işaret ettiği gibi zsh.
CTodea

3

Burada yeni satırlara eklemenin pratik olduğu bir senaryo, mod aktifken readkomutun kullanılmasıdır set -e. set -eBir betiğin (az ya da çok) sıfır olmayan bir durum kodu üreten ifadelerle karşılaştığında sona ermesine neden olduğunu hatırlayın . Yeni readsatırları olmayan bir dize ile karşılaştığında sıfır olmayan bir durum kodu oluşturduğunu düşünün :

#!/bin/bash
set -e

# The following statement succeeds because here-strings append a newline:
IFS='' read -r <<< 'newline appended'
echo 'Made it here'

# The following statement fails because 'read' returns a non-zero status
# code when no newlines are encountered.
printf 'no newline' | IFS='' read -r
echo 'Did not make it here'

-3

Bence burada yeni bir satır elde etmenin tek yolu bu.

xxd <<<`echo -ne "a\n"`

Here-string operatörünün gönderdiğiniz sözdiziminde belirtilmedikçe yeni satırları çıkardığı anlaşılıyor.


4
Son yeni çizgiyi çıkaran komut değişikliği. Bunu basitleştirebilirsin xxd <<<$(echo a).
Gilles 'SO- kötülük olmayı'
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.