Dalam beberapa shell (termasuk bash
):
IFS=: command eval 'p=($PATH)'
(dengan bash
, Anda dapat menghilangkan command
emulasi jika tidak dalam sh / POSIX). Namun berhati-hatilah bahwa ketika menggunakan variabel yang tidak dikutip, Anda juga umumnya perlu set -f
, dan tidak ada cakupan lokal untuk itu di sebagian besar shell.
Dengan zsh, Anda dapat melakukan:
(){ local IFS=:; p=($=PATH); }
$=PATH
adalah untuk memaksa pemisahan kata yang tidak dilakukan secara default di zsh
(globbing pada ekspansi variabel tidak dilakukan sehingga Anda tidak perlu set -f
kecuali dalam emulasi sh).
(){...}
(atau function {...}
) disebut fungsi anonim dan biasanya digunakan untuk mengatur cakupan lokal. dengan shell lain yang mendukung lingkup fungsi lokal, Anda bisa melakukan sesuatu yang mirip dengan:
e() { eval "$@"; }
e 'local IFS=:; p=($PATH)'
Untuk menerapkan lingkup lokal untuk variabel dan opsi dalam cangkang POSIX, Anda juga dapat menggunakan fungsi yang disediakan di https://github.com/stephane-chazelas/misc-scripts/blob/master/locvar.sh . Maka Anda dapat menggunakannya sebagai:
. /path/to/locvar.sh
var=3,2,2
call eval 'locvar IFS; locopt -f; IFS=,; set -- $var; a=$1 b=$2 c=$3'
(Ngomong-ngomong, tidak sah untuk memecah $PATH
seperti itu di atas kecuali dalam zsh
seperti pada shell lainnya, IFS adalah pembatas lapangan, bukan pemisah bidang).
IFS=$'\n' a=($str)
Apakah hanya dua tugas, satu demi satu sama suka a=1 b=2
.
Catatan penjelasan tentang var=value cmd
:
Di:
var=value cmd arg
Shell dieksekusi /path/to/cmd
dalam proses baru dan melewati cmd
dan arg
masuk argv[]
dan var=value
masuk envp[]
. Itu bukan benar-benar tugas variabel, tetapi lebih banyak mengirimkan variabel lingkungan ke perintah yang dieksekusi . Dalam shell Bourne atau Korn, dengan set -k
, Anda bahkan dapat menulisnya cmd var=value arg
.
Sekarang, itu tidak berlaku untuk builtin atau fungsi yang tidak dijalankan . Dalam cangkang Bourne, dalam var=value some-builtin
, var
akhirnya ditetapkan setelahnya, sama seperti dengan var=value
sendirian. Itu berarti misalnya bahwa perilaku var=value echo foo
(yang tidak berguna) bervariasi tergantung pada apakah echo
builtin atau tidak.
POSIX dan / atau ksh
mengubahnya dalam perilaku Bourne yang hanya terjadi untuk kategori builtin yang disebut builtin khusus . eval
adalah builtin khusus, read
bukan. Untuk builtin non khusus, var=value builtin
set var
hanya untuk eksekusi builtin yang membuatnya berperilaku mirip dengan ketika perintah eksternal dijalankan.
The command
perintah dapat digunakan untuk menghapus khusus atribut yang builtin khusus . Apa POSIX diabaikan adalah bahwa untuk eval
dan .
builtin, itu berarti bahwa shell harus mengimplementasikan tumpukan variabel (meskipun itu tidak menentukan perintah local
atau typeset
ruang lingkup membatasi), karena Anda bisa melakukan:
a=0; a=1 command eval 'a=2 command eval echo \$a; echo $a'; echo $a
Atau bahkan:
a=1 command eval myfunction
dengan myfunction
menjadi fungsi menggunakan atau pengaturan $a
dan berpotensi memanggil command eval
.
Itu benar-benar diabaikan karena ksh
(yang sebagian besar didasarkan pada spesifikasi) tidak mengimplementasikannya (dan AT&T ksh
dan zsh
masih tidak), tetapi saat ini, kecuali kedua, sebagian besar shell mengimplementasikannya. Perilaku bervariasi di antara cangkang meskipun dalam hal-hal seperti:
a=0; a=1 command eval a=2; echo "$a"
meskipun. Menggunakan local
shell yang mendukungnya adalah cara yang lebih dapat diandalkan untuk mengimplementasikan cakupan lokal.
IFS=: command eval …
menetapkanIFS
untuk durasieval
, seperti yang diamanatkan oleh POSIX, di dash, pdksh dan bash, tetapi tidak di ksh 93u. Tidak biasa melihat ksh menjadi orang aneh-tidak-patuh.