(4 jawaban)
Tutup 2 tahun lalu.
Salah satu rekan kerja saya telah memberi saya sintaks Bash yang tidak saya kenal. Google foo saya gagal dalam mencari tahu apa fungsinya dan mengapa/kapan saya harus menggunakannya.
Perintah yang dia kirimkan kepada saya adalah dalam bentuk ini:
someVariable=something
command
Awalnya, saya pikir ini setara dengan yang berikut:
someVariable=something ; command
Atau
someVariable=something
command
Tapi ini tampaknya tidak terjadi. Contoh:
[Jan-03 11:26][~]$ # Look at the environment variable BAZ. It is currently empty
[Jan-03 11:26][~]$ echo $BAZ
[Jan-03 11:27][~]$ # Try running a command of the same format
[Jan-03 11:27][~]$ BAZ=jake echo $BAZ
[Jan-03 11:27][~]$
[Jan-03 11:27][~]$ # Now, echo BAZ again. It is still empty:
[Jan-03 11:27][~]$ echo $BAZ
[Jan-03 11:27][~]$
[Jan-03 11:28][~]$
[Jan-03 11:28][~]$ # If we add a semi-colon to the command, we get dramatically different results:
[Jan-03 11:28][~]$ BAZ=jake ; echo $BAZ
jake
[Jan-03 11:28][~]$
[Jan-03 11:28][~]$ # And we can see that the variable is actually set:
[Jan-03 11:29][~]$ echo $BAZ
jake
[Jan-03 11:29][~]$
Apa yang dilakukan sintaks ini? Apa yang terjadi pada variabel yang telah ditetapkan? Mengapa ini berhasil?
Jawaban yang Diterima:
Ini setara dengan:
( export someVariable=something; command )
Ini membuat someVariable
variabel lingkungan, dengan nilai yang ditetapkan, tetapi hanya untuk perintah yang dijalankan.
Berikut adalah bagian yang relevan dari bash
panduan:
Perintah Sederhana
Perintah sederhana adalah urutan penugasan variabel opsional diikuti oleh kata-kata dan pengalihan yang dipisahkan kosong, dan diakhiri oleh operator kontrol. Kata pertama menentukan perintah yang akan dieksekusi, dan diteruskan sebagai argumen nol. Kata-kata yang tersisa dilewatkan sebagai argumen untuk perintah yang dipanggil.
(…)
Ekspansi Perintah Sederhana
Jika tidak ada nama perintah yang dihasilkan [dari ekspansi perintah], penetapan variabel memengaruhi lingkungan shell saat ini. Jika tidak, variabel ditambahkan ke lingkungan perintah yang dijalankan dan tidak memengaruhi lingkungan shell saat ini .
Catatan:ingatlah bahwa ini tidak khusus untuk bash
, tetapi ditentukan oleh POSIX.
Edit – Rangkuman diskusi dari komentar di jawaban
Alasan BAZ=JAKE echo $BAZ
, tidak mencetak JAKE karena substitusi variabel dilakukan sebelum hal lain. Jika Anda mengabaikan substitusi variabel, ini akan berperilaku seperti yang diharapkan:
$ echo_baz() { echo "[$BAZ]"; }
$ BAZ=Jake echo_baz
[Jake]
$ echo_baz
[]