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 bashokunmadığı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 -iya da perl -pive bazı editörler, örneğin)).
Veya senaryonuzu şöyle yazabilirsiniz:
{
sleep 20
echo test
}; exit
( Kapatma exithattı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'
}
\ue9Komut 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 sourceaka .komutu kullanılırsa, bazı kabuklarda kaynak dosyalarında aynı problemi yaşarsınız.
Bu böyle değil ait bashkimin olsa sourcekomut 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_sourcedpü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)