Apa gunanya perintah "ekspor"?

12

Saya membuat variabel lingkungan di satu jendela terminal dan mencoba untuk mengulanginya di jendela terminal lain. Itu tidak menunjukkan apa-apa.

$TEST=hello

Setelah itu saya mengekspornya dan mencoba lagi echodi jendela terminal yang berbeda. hasilnya sama seperti sebelumnya.

export TEST 

tetapi jika saya menjalankan kode yang sama pada saat login (menambahkan kode ke ~/.profilefile) variabel dapat digunakan jendela terminal apa pun. Apa yang terjadi disini? Apa perbedaan antara mengeksekusi kode di terminal dan mengeksekusi yang sama saat login?

DScript
sumber

Jawaban:

25

exportmembuat variabel sesuatu yang akan dimasukkan dalam lingkungan proses anak. Itu tidak mempengaruhi lingkungan lain yang sudah ada. Secara umum tidak ada cara untuk mengatur variabel di satu terminal dan membuatnya secara otomatis muncul di terminal lain, lingkungan dibuat untuk setiap proses sendiri.

Menambahkannya ke Anda .profilemembuatnya sehingga lingkungan Anda akan diatur untuk memasukkan variabel baru itu setiap kali Anda masuk. Jadi itu tidak diekspor dari satu shell ke yang lain, tetapi malah menginstruksikan shell baru untuk memasukkannya ketika mengatur lingkungan awal.

Eric Renouf
sumber
1

Setiap proses memiliki beberapa atribut yang proses dapat atur secara individual dan independen dari proses lain. Contohnya adalah batasan sumber daya, umask, direktori saat ini, variabel lingkungan dan beberapa lainnya. Setelah proses pembuatan (melalui fork()panggilan sistem) anak mewarisi atribut ini dari orang tua. Setelah ini, proses anak dapat mengatur atribut ini secara sewenang-wenang. (Beberapa pembatasan berlaku, suatu proses mungkin tidak meningkatkan batas sumber daya keras atau mengubah direktori saat ini ke direktori yang tidak memiliki izin eksekutif.)

Hanya sedikit program yang memodifikasi variabel lingkungannya, kebanyakan tidak peduli. Misalkan kasus yang terakhir. Jadi jika proses anak menciptakan sendiri anak-anak selanjutnya, maka proses ini akan memiliki variabel lingkungan yang sama dengan kakek-nenek. Dan seterusnya.

Sekarang, shell memiliki banyak variabel yang dapat dilihat dengan set(dalam shell dari tipe Bourne Shell, tidak tahu tentang C Shell). Variabel-variabel ini bukan variabel lingkungan kecuali mereka exported. Variabel lingkungan dapat dilihat dengan env. Jika Anda meluncurkan program dari baris perintah shell, program akan mewarisi variabel lingkungan dari shell. Demikian juga untuk program yang diluncurkan dari skrip shell.

Oleh karena itu, setelah masuk ada shell yang membaca data profil (misalnya ~/.profile) dan mewariskannya ke hampir semua anak, cucu, dan sebagainya. Ini adalah bagaimana pengaturan variabel lingkungan mengalir dari shell login atau skrip login ke semua program lain yang diluncurkan dalam sesi login.

Saya membuat variabel lingkungan di satu jendela terminal dan mencoba untuk mengulanginya di jendela terminal lain. Itu tidak menunjukkan apa-apa.

Dengan penjelasan di atas, inilah hasil yang diharapkan. Perubahan dalam lingkungan suatu proses hanya memengaruhi anak-anak dari proses ini yang dibuat untuk selanjutnya, bukan yang sudah ada.

$TEST=hello

Ini tidak mungkin berhasil, kecuali ekspansi variabel dinonaktifkan atau $TESTsudah memiliki nilai yang sesuai. Jika Anda ingin menetapkan helloke variabel TESTmaka Anda harus mengatakan TEST=hello(catatan: tidak $).

Setelah itu saya mengekspornya dan mencoba lagi echodi jendela terminal yang berbeda. hasilnya sama seperti sebelumnya.

Sekali lagi, ini adalah hasil yang diharapkan.

tetapi jika saya menjalankan kode yang sama pada saat login (menambahkan kode ke ~/.profilefile) variabel dapat digunakan jendela terminal apa pun.

Ini karena shell di terminal adalah turunan dari shell yang membaca pengaturan lingkungan dari ~/.profiledan dengan demikian mewarisi pengaturan ini.

countermode
sumber