Temel fikir olduğunu VAR=VALUE some-commandsetleri VARiçin VALUEyürütülmesi için some-commandzaman some-commandharici bir komut olduğunu ve bundan daha fazla fantezi almaz. Bu sezgiyi bir kabuğun nasıl çalıştığı bilgisiyle birleştirirseniz, çoğu durumda doğru cevabı bulmalısınız. POSIX başvurusu, “Kabuk Komut Dili” bölümündeki “Basit Komutlar” dır .
Eğer some-commandbir olan dış komut , VAR=VALUE some-commandeşdeğerdir env VAR=VALUE some-command. VAR, dışına aktarılır some-commandve kabuktaki değeri (veya değer eksikliği) değişmez.
Eğer some-commandbir olan fonksiyon , daha sonra VAR=VALUE some-commandeşdeğerdir VAR=VALUE; some-command, yani yerinde atama kalıntıları işlevi sonra döndü, ve değişken ortama ihraç edilmez. Bunun nedeni Bourne kabuğunun tasarımı ile ilgilidir (ve daha sonra geriye dönük uyumluluk ile): bir işlevin yürütülmesi etrafında değişken değerleri kaydetmek ve geri yüklemek için hiçbir olanağı yoktu. Değişkenin dışa aktarılmaması anlamlıdır, çünkü bir işlev kabuğun kendisinde yürütülür. Bununla birlikte, ksh (ATT ksh93 ve pdksh / mksh dahil), bash ve zsh VAR, yalnızca işlevin yürütülmesi sırasında ayarlanan (ayrıca dışa aktarılır) daha kullanışlı davranışı uygular . Gelen ksh işlevi Ksh sözdizimi ile tanımlanması durumunda, bu yapılırfunction NAME …, standart sözdizimiyle tanımlanmışsa değil NAME (). In bash (ile çalıştırdığınızda, bu POSIX modunda, sadece bash modda yapılır POSIXLY_CORRECT=1). In zsh , bu yapılır posix_builtinsseçeneği ayarlı değil; bu seçenek varsayılan olarak ayarlanmamıştır emulate shveya veya ile açıktır emulate ksh.
Eğer some-commandbir yerleşiğidir, davranış yerleşiği türüne bağlıdır. Özel yapıların işlevleri gibi davranır. Özel yerleşikler, durum kabuğunu etkilediği için kabuğun içine uygulanması gerekenlerdir (örneğin breakkontrol akışını cdetkiler, geçerli dizini setetkiler, konumsal parametreleri ve seçenekleri etkiler…). Diğer yerleşikler yalnızca performans ve rahatlık için yerleşiktir (çoğunlukla - örneğin bash özelliği printf -vyalnızca bir yerleşik tarafından uygulanabilir) ve harici bir komut gibi davranırlar.
Atama eğer öyleyse, takma genişleme sonrasında gerçekleşir some-commandbir olduğunu takma , ne bulmak için ilk genişletin.
Tüm durumlarda atamanın, komut satırının kendisinde herhangi bir değişken ikame de dahil olmak üzere komut satırı ayrıştırıldıktan sonra gerçekleştirildiğini unutmayın. Yani var=a; var=b echo $varyazdırır a, çünkü $varödev yapılmadan önce değerlendirilir. Ve böylece IFS=. printf "%s\n" $vareski IFSdeğeri bölmek için kullanır $var.
Tüm komut türlerini kapsadım, ancak bir durum daha var : çalıştırılacak komut olmadığında , yani komut yalnızca atamalardan (ve muhtemelen yeniden yönlendirmelerden) oluşursa. Bu durumda, görev yerinde kalır . VAR=VALUE OTHERVAR=OTHERVALUEeşittir VAR=VALUE; OTHERVAR=OTHERVALUE. Böylece IFS=. arr=($var), IFSayarlanmış olarak kalır .. Kullanabileceğin yana $IFSatamaya arrzaten onun yeni değere sahip olduğu beklentisiyle, bu yeni değeri mantıklı IFSgenişletilmesi için kullanılır $var.
Özetle, kullanabileceğiniz IFSiçin geçici sadece saha bölünme:
- yeni bir kabuk veya alt kabuk başlatarak (örn . değeri iki karakterden az olduğunda farklı davranmaları dışında
third=$(IFS=.; set -f; set -- $var; echo "$3")karmaşık bir yöntemdir );third=${var#*.*.}var.
- ksh içinde,
IFS=. some-functionburada some-functionksh sözdizimi ile tanımlanır function some-function …;
- bash ve zsh'da,
IFS=. some-functionuyumluluk modunun aksine yerel modda çalıştıkları sürece.
IFSkalır." Eek. İlk kısmı okuduktan sonra, bu mantıklı, ama bu Q'yu göndermeden önce bunu beklemezdim.