Yanıtlar:
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 printf
bir boru hattı kullanın.
<<<
Bourne dünyasına zsh
değil , tanıtıldı ksh
. Ve bunun Unix limanında benzer operatör esinlenerek rc
yaptım hangi değil bu ekstra satır karakteri ekleyin. İlginçtir ki, =(<<<text)
operatör bu yeni satırı eklenmez zsh
.
printf
yeni 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
.
Burada yeni satırlara eklemenin pratik olduğu bir senaryo, mod aktifken read
komutun kullanılmasıdır set -e
. set -e
Bir 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 read
satı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'
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.
xxd <<<$(echo a)
.