OS : Ubuntu 16.04.3
Shell : Bash 4.3.48
Saya tahu itu mungkin untuk sementara mengubah konten variabel seperti var=value command
, mungkin IFS= read -r var
merupakan kasus yang paling menonjol dari ini.
Dan, terima kasih kepada wiki Greg , saya juga mengerti:
# Why this
foo() { echo "$var"; }
var=value foo
# And this does work
var=value; echo "$var"
# But this doesn't
var=value echo "$var"
Apa yang luput dari pemahaman saya adalah ini:
$ foo() { echo "${var[0]}"; }
$ var=(bar baz) foo
(bar baz)
Sejauh yang saya tahu (dan mengikuti logika dari contoh sebelumnya), itu harus dicetak bar
, bukan (bar baz)
.
Apakah ini hanya terjadi pada saya? Apakah ini perilaku yang dimaksudkan dan saya kehilangan sesuatu? Atau ini bug?
export var=(foo bar); echo "${var[0]}"
mencetakfoo
, tidak(foo bar)
.export
menunjukkan:declare -ax var=([0]="foo" [1]="bar")
export i_am_array=(foo bar); /usr/bin/env | grep i_am_array
tidak memberikan output di sini.foo() { declare -p var; } ; var=(bar baz) foo
memberideclare -x var="(bar baz)"
konfirmasi itu diperlakukan sebagai string, bukan arrayJawaban:
Secara umum memanggil:
Di mana
cmd
fungsinya tidak portabel.Dengan
bash
, itu hanya berfungsi untuk variabel skalar (dan denganx=(...)
diuraikan sebagai array tetapi ditugaskan sebagai skalar) dan ada sejumlah masalah dengan pelingkupan jika Anda melakukan itu, denganksh93
danyash
, berfungsi tetapi definisi variabel tetap setelahnya. Denganmksh
, Anda mendapatkan kesalahan sintaksis. Di shell Bourne, itu tidak bekerja sama sekali, bahkan untuk variabel skalar.Juga perhatikan bahwa bahkan dengan variabel skalar, apakah variabel tersebut akhirnya diekspor dalam fungsi (yaitu, diteruskan ke perintah yang dijalankan) bervariasi dari shell ke shell (itu dalam bash, yash, mksh, zsh, tetapi tidak di ksh, Abu).
Ini hanya bekerja seperti yang Anda harapkan
zsh
. Perhatikan bahwazsh
indeks array mulai dari 1.sumber
Ini bukan hanya bug, tampaknya menjadi fitur yang tidak diterapkan tanpa rencana yang pernah jadi. Posting milis ini dari 2014 memuat ini dari penciptanya:
Menarik dari repo git terbaru untuk Bash memiliki ini di
variables.c
:Menyarankan bahwa apa pun yang ada tidak lengkap.
sumber
execve()
panggilan sistem yang terlibat. Lihatzsh
shell yang mendukung fungsi panggilan dengan larik yang sementara diatur seperti itu.my_var=one func_bar
. Bisakah kita mengatakan, ituexport
menambah lingkungan dan dengan demikian, ekspor digunakan di sini, di bawah tenda? Lihatlah jawaban saya, saya menambahkan kode demonstrasi.Dari bagian
man bash
BUGS (versibash
4.3 adalah):Kode selanjutnya menunjukkan, bahwa variabel sementara ada di lingkungan, hanya ketika fungsi sedang berjalan. Ketika fungsi selesai, variabel sementara menghilang.
Informasi terkait:
VAR=VALUE some-command
konstruksinya.sumber