Biasanya, dimungkinkan untuk mengatur variabel lingkungan untuk suatu perintah dengan mengawalinya seperti ini:
hello=hi bash -c 'echo $hello'
Saya juga tahu bahwa kita bisa menggunakan variabel untuk mengganti setiap bagian dari permintaan perintah seperti berikut:
$ cmd=bash
$ $cmd -c "echo hi" # equivalent to bash -c "echo hi"
Saya sangat terkejut mengetahui bahwa Anda tidak dapat menggunakan variabel untuk mengawali perintah untuk mengatur variabel lingkungan. Kasus cobaan:
$ prefix=hello=hi
$ echo $prefix # prints hello=hi
$ $prefix bash -c 'echo $hello'
hello=hi: command not found
Mengapa saya tidak bisa mengatur variabel lingkungan menggunakan variabel? Apakah awalan merupakan bagian khusus? Saya bisa membuatnya bekerja dengan menggunakan eval di depan, tetapi saya masih tidak mengerti mengapa. Saya menggunakan bash 4.4.
bash
environment-variables
variable
wbkang
sumber
sumber
env
bukaneval
, IIRC mana yang lebih aman, tetapi lebih lambat.Jawaban:
Saya menduga ini adalah bagian dari urutan yang menangkap Anda:
Itu dari manual referensi Bash di bagian Ekspansi Perintah Sederhana.
Dalam
cmd=bash
contoh tersebut, tidak ada variabel lingkungan yang ditetapkan, dan bash memproses baris perintah melalui ekspansi parameter, meninggalkanbash -c "echo hi"
.Dalam
prefix=hello=hi
contoh ini, tidak ada lagi penugasan variabel dalam pass pertama, jadi pemrosesan berlanjut ke ekspansi parameter, menghasilkan kata pertamahello=hi
.Setelah tugas variabel telah diproses, mereka tidak diproses ulang selama eksekusi perintah.
Lihat pemrosesan dan hasilnya di bawah
set -x
:Untuk variasi yang lebih aman dari "ekspansi variabel" -as- "variabel lingkungan" daripada
eval
, pertimbangkan saran wjandrea tentangenv
:Ini bukan semata-mata penugasan variabel baris perintah, karena kita menggunakan
env
fungsi utama utilitas untuk menugaskan variabel lingkungan ke suatu perintah, tetapi itu mencapai tujuan yang sama. The$prefix
variabel diperluas selama pengolahan baris perintah, memberikan nama = nilaienv
, yang dibagikan bersama untukbash
.sumber
$foo=bar bash -c ...
tidak akan berfungsi, karena$foo=bar
bukan penugasan variabel (apa pun nilainya$foo
), karena$foo=bar
tidak cocok denganname=value
pola penugasan variabel.Karena
$prefix
bukan tugas. @ Jeff memiliki penjelasan yang lebih panjang .Anda bisa melakukan hal serupa dengan fungsi:
... dan Anda bahkan dapat menumpuknya, jika Anda suka:
sumber