Bazı mermilerde (dahil bash):
IFS=: command eval 'p=($PATH)'
(ile bash, commandsh / POSIX emülasyonunda değilse ihmal edebilirsiniz ). Ancak, alıntılanmamış değişkenleri kullanırken, genel olarak buna ihtiyaç duyduğunuzdan set -fve çoğu kabukta bunun için yerel bir kapsamın olmadığına dikkat edin.
Zsh ile şunları yapabilirsiniz:
(){ local IFS=:; p=($=PATH); }
$=PATHvarsayılan olarak zshgirilmeyen kelimeyi bölmeyi zorlamaktır (değişken genişlemenin üzerinde işlem yapmak ya da set -femülasyonda olmadıkça).
(){...}(veya function {...}) isimsiz işlevler olarak adlandırılır ve genellikle yerel bir kapsam belirlemek için kullanılır. işlevlerde yerel kapsamı destekleyen diğer kabuklarla, şunlara benzer bir şey yapabilirsiniz:
e() { eval "$@"; }
e 'local IFS=:; p=($PATH)'
POSIX mermilerinde değişkenler ve seçenekler için yerel kapsam uygulamak için, https://github.com/stephane-chazelas/misc-scripts/blob/master/locvar.sh adresinde verilen işlevleri de kullanabilirsiniz . O zaman olarak kullanabilirsiniz:
. /path/to/locvar.sh
var=3,2,2
call eval 'locvar IFS; locopt -f; IFS=,; set -- $var; a=$1 b=$2 c=$3'
(bu arada, diğer mermilerdeki gibi, $PATHyukarıdaki şekilde bölüştürmek geçersizdir zsh, IFS alan ayırıcıdır, alan ayırıcı değildir).
IFS=$'\n' a=($str)
Sadece iki ödev, birbiri ardına olduğu gibi a=1 b=2.
İle ilgili açıklama notu var=value cmd:
İçinde:
var=value cmd arg
Kabuk yürütür /path/to/cmdyeni bir işlem ve geçiş bölgesi cmdve argde argv[]ve var=valuede envp[]. Bu gerçekten değişken bir atama değil, exec komutuna geçen ortam değişkenlerinin sayısıdır . Bourne veya Korn kabuğunda, set -khatta yazabilirsiniz cmd var=value arg.
Şimdi bu, yürütülmeyen yerleşiklere veya işlevlere uygulanmaz . Bourne kabuğu, içinde var=value some-builtin, varyukarı uçları sadece olduğu gibi, sonradan ayarlanan var=valueyalnız. Bu, örneğin var=value echo foo(yararlı olmayan) davranışının echoyerleşik olup olmamasına bağlı olarak değiştiği anlamına gelir .
POSIX ve / veya kshBourne davranışının yalnızca özel yerleşikler adı verilen bir kategori türü için gerçekleştiğini değiştirmiştir . evalözel bir yapı, readöyle değil. Özel olmayan yerleşikler için, yalnızca harici bir komut çalıştırıldığında benzer şekilde davranmasını sağlayan yerleşikin yürütülmesi için var=value builtinayarlar var.
commandKomut kaldırmak için kullanılabilecek özel olanların niteliğini özel yerleşikleri . POSIX'in göz ardı ettiği şey şu ki, evalve .builtins için, kabukların değişken bir yığın uygulamak zorunda kalacağı anlamına geliyordu (bunun için localya da typesetkapsam sınırlama komutlarını belirtmese bile ):
a=0; a=1 command eval 'a=2 command eval echo \$a; echo $a'; echo $a
Ya da:
a=1 command eval myfunction
ile myfunctionbir fonksiyonu olduğu kullanarak veya ayar $ave potansiyel çağırarak command eval.
Bu gerçekten göz ardı edildi, çünkü ksh(en çok dayanan spesifikasyondu) bunu uygulamamıştı (ve AT&T kshve zshhala yok), ama bugünlerde, bu iki hariç, çoğu mermi onu uyguluyor. Davranış kabukları arasında farklılık gösterir:
a=0; a=1 command eval a=2; echo "$a"
rağmen. localYerel kapsamı uygulamak için onu destekleyen mermileri kullanmak daha güvenilir bir yoldur.
IFS=: command eval …setleriIFSsadece süresinceevalKsh 93u içinde tire, pdksh ve bash, POSIX tarafından zorunlu değil gibi. Ksh’ın garip olmayan bir-bir-out olduğunu görmek alışılmadık bir durum.