Masalahnya, Ditinjau Kembali
Sejujurnya, manual ini membingungkan dalam hal ini. The pengguna GNU Bash mengatakan:
Lingkungan untuk setiap perintah atau fungsi sederhana [perhatikan bahwa ini tidak termasuk bawaan] dapat ditambah sementara dengan mengawalnya dengan penetapan parameter, seperti yang dijelaskan dalam Parameter Shell. Pernyataan penugasan ini hanya mempengaruhi lingkungan yang terlihat oleh perintah itu.
Jika Anda benar-benar mengurai kalimat tersebut, maksudnya adalah lingkungan untuk perintah / fungsi diubah, tetapi bukan lingkungan untuk proses induk. Jadi, ini akan berhasil:
$ TESTVAR=bbb env | fgrep TESTVAR
TESTVAR=bbb
karena lingkungan untuk perintah env telah dimodifikasi sebelum dijalankan. Namun, ini tidak akan berhasil:
$ set -x; TESTVAR=bbb echo aaa $TESTVAR ccc
+ TESTVAR=bbb
+ echo aaa ccc
aaa ccc
karena ketika ekspansi parameter dilakukan oleh shell.
Langkah Penerjemah
Bagian lain dari masalah ini adalah Bash menentukan langkah-langkah berikut untuk penerjemahnya:
- Membaca masukannya dari file (lihat Skrip Shell), dari string yang disediakan sebagai argumen ke opsi pemanggilan -c (lihat Memanggil Bash), atau dari terminal pengguna.
- Memecah input menjadi kata-kata dan operator, mematuhi aturan kutipan yang dijelaskan di Quoting. Token ini dipisahkan oleh karakter meta. Ekspansi alias dilakukan dengan langkah ini (lihat Alias).
- Mengurai token menjadi perintah sederhana dan gabungan (lihat Perintah Shell).
- Melakukan berbagai ekspansi shell (lihat Ekspansi Shell), memecah token yang diperluas menjadi daftar nama file (lihat Perluasan Nama File) serta perintah dan argumen.
- Melakukan pengalihan yang diperlukan (lihat Pengalihan) dan menghapus operator pengalihan dan operannya dari daftar argumen.
- Jalankan perintah (lihat Perintah Pelaksana).
- Secara opsional menunggu perintah selesai dan mengumpulkan status keluarnya (lihat Status Keluar).
Apa yang terjadi di sini adalah bahwa bawaan tidak mendapatkan lingkungan eksekusinya sendiri, jadi mereka tidak pernah melihat lingkungan yang dimodifikasi. Selain itu, perintah-perintah sederhana (misalnya / bin / echo) yang mendapatkan ennvironment dimodifikasi (yang mengapa contoh env bekerja) tetapi ekspansi shell berlangsung di saat lingkungan pada langkah # 4.
Dengan kata lain, Anda tidak mengirimkan 'aaa $ TESTVAR ccc' ke / bin / echo; Anda meneruskan string yang diinterpolasi (seperti yang diperluas di lingkungan saat ini) ke / bin / echo. Dalam kasus ini, karena lingkungan saat ini tidak memiliki TESTVAR , Anda cukup meneruskan 'aaa ccc' ke perintah.
Ringkasan
Dokumentasinya bisa jauh lebih jelas. Untung ada Stack Overflow!
Lihat juga
http://www.gnu.org/software/bash/manual/bashref.html#Command-Execution-Environment