Penting untuk dipahami bahwa setiap proses memiliki variabel lingkungannya sendiri.
Ketika suatu proses panggilan fork()
sistem panggilan, proses kedua ( anak ) identik dengan yang pertama ( induk ) dibuat ( salinan ini termasuk lingkungan, yang berada tepat di atas tumpukan (atau tepat di bawah, tergantung bagaimana Anda memikirkan tumpukan :-)
- tapi di unix / linux tumpukan tumbuh ke bawah dari alamat yang tinggi).
Biasanya, proses anak kemudian akan memanggil panggilan execve()
sistem, yang akan membuang semua yang ada dalam memori (virtual) dan merekonstruksi dari bagian kode dan data dalam file biner yang ditentukan.
Namun, ketika ia merekonstruksi stack, ia menyalin lingkungan dan string argumen yang dilewatkan execve()
ke stack terlebih dahulu (dalam urutan itu), sebelum memanggil main()
fungsi (banyak pekerjaan dilakukan dalam crt0
kode bootstrap setelah execve()
pengembalian (ke entri) titik yang ditentukan dalam biner)).
Ada pembungkus untuk execve()
pemanggilan sistem di pustaka C yang akan melewati lingkungan saat ini (yaitu salinan lingkungan orang tua), alih-alih pemanggil yang menyediakannya (jadi akibatnya anak akan mewarisi lingkungan orang tua) - lihat environ(7)
.
Coba jalankan (sebagai root) perintah ps axeww | less
... ini akan menunjukkan lingkungan untuk semua proses! Yang menarik adalah proses id 1 (yaitu init
proses - proses pertama yang dibuat oleh kernel saat boot).
Jika Anda ingin melihat lingkungan untuk proses tertentu (dan Anda tahu itu proses id), coba jalankan perintah cat /proc/<PID>/environ
(ganti <PID>
dengan id proses).
Perhatikan bahwa jika suatu proses memiliki hak istimewa yang cukup, ia dapat menulis ulang tumpukannya sendiri, yang dapat membuatnya sulit untuk mengetahui apa lingkungannya - Anda akan melihat beberapa proses daemon seperti ini di output ps.
Tetapi pada akhirnya, semua wafel ini bermuara pada apa yang dikatakan @chaos di atas, jika Anda ingin melihat nilai saat ini dari variabel lingkungan tertentu dalam proses shell Anda, cukup gunakan perintah (builtin) echo "$<NAME>"
(ganti <NAME>
dengan nama variabel lingkungan tempat Anda tertarik) ... ketahuilah bahwa variabel yang sama mungkin memiliki nilai yang berbeda, atau tidak ada sama sekali, dalam proses lain.
echo
adalah pilihan perintah yang buruk karena dapat mengubah konten variabel. Ini akan menampilkan konten dari parameter shell dengan nama yang sama. Itu tidak selalu sama jika menggunakan shell Bourne atau untuk env vars seperti1
,*
misalnya. Dan Anda tidak dapat menggunakan pendekatan itu untuk env vars yang namanya tidak valid sebagai nama variabel shell.