Evet kabukları ve bash
özellikle de dosyayı tek seferde bir satır okumak için dikkatli olun, bu nedenle etkileşimli olarak kullandığınız zamanki gibi çalışır.
Dosya aranamadığında (bir boru gibi), karakterin bash
okunmadığından emin olmak için bir seferde bir bayt okuduğunu fark edeceksiniz \n
. Dosya aranabilir olduğunda, bir kerede tam blokları okuyarak en iyi duruma getirir, ancak sonrasına geri dönün \n
.
Bunun gibi şeyler yapabilirsiniz anlamına gelir:
bash << \EOF
read var
var's content
echo "$var"
EOF
Veya kendilerini güncelleyen komut dosyaları yazabilirsiniz. Size bu garantiyi vermezse yapamayacağınız bir şey.
Şimdi, bunun gibi şeyler yapmak nadirdir ve sizin de fark ettiğiniz gibi, bu özellik faydalı olduğundan daha sık karşılaşır.
Bunu önlemek için, dosyayı yerinde değiştirmediğinizden emin olabilirsiniz (örneğin, bir kopyayı değiştirebilir ve kopyayı yerine taşıyabilirsiniz (örneğin sed -i
ya da perl -pi
ve bazı editörler, örneğin)).
Veya senaryonuzu şöyle yazabilirsiniz:
{
sleep 20
echo test
}; exit
( Kapatma exit
hattından }
hemen önce aynı parantez içinde olmasına rağmen;
veya:
main() {
sleep 20
echo test
}
main "$@"; exit
Bir exit
şey yapmadan önce kabuğun betiği okuması gerekecektir . Bu, kabuğun komut dosyasından tekrar okunmamasını sağlar.
Bu, tüm komut dosyasının hafızada saklanacağı anlamına gelir.
Bu ayrıca betiğin ayrıştırılmasını da etkileyebilir.
Örneğin, içinde bash
:
export LC_ALL=fr_FR.UTF-8
echo $'St\ue9phane'
U + 00E9’un UTF-8’de kodlanmış olduğunu gösterir. Ancak, bunu değiştirirseniz:
{
export LC_ALL=fr_FR.UTF-8
echo $'St\ue9phane'
}
\ue9
Komut bu durumda olan ayrıştırıldı o zaman yürürlükte olan charset genişletilecek önceexport
komut yürütülür.
Ayrıca, eğer source
aka .
komutu kullanılırsa, bazı kabuklarda kaynak dosyalarında aynı problemi yaşarsınız.
Bu böyle değil ait bash
kimin olsa source
komut yorumlayarak önce tamamen dosyasını okur. Özellikle yazıyorsanız bash
, betiğin başına ekleyerek bunu gerçekten kullanabilirsiniz:
if [[ ! $already_sourced ]]; then
already_sourced=1
source "$0"; exit
fi
(Gelecekteki sürümlerinin bash
şu anda bir sınırlama olarak görülen davranışı değiştirebileceğini hayal edebileceğinize inanmıyorum (bash ve AT&T ksh, söyleyebileceği kadarıyla davranan tek POSIX benzeri kabuklarıdır) ve already_sourced
püf noktası, değişkenin çevrede olmadığını varsaydığı için biraz kırılgandır, BASH_SOURCE değişkeninin içeriğini etkilediğinden bahsetmez)