Apa yang dilakukan ekspor dalam BASH? [duplikat]

75

Kemungkinan Duplikat:
Perbedaan antara "a = b" dan "ekspor a = b" di bash

Sulit untuk mengakui, tetapi saya tidak pernah benar-benar mengerti apa yang sebenarnya exportdilakukan pada variabel lingkungan. Saya tahu bahwa jika saya tidak mengekspor variabel saya kadang-kadang tidak bisa melihatnya dalam proses anak, tetapi kadang-kadang sepertinya saya bisa. Apa yang sebenarnya terjadi ketika saya katakan

export foo=5

dan kapan saya tidak harus mengekspor variabel?

Chas. Owens
sumber
Berikut ini tautan ke setidaknya satu pertanyaan bermanfaat lainnya tentang topik ini: superuser.com/questions/143413/linux-environment-variables ... karena ironisnya pertanyaan ini adalah yang pertama muncul di Google untuk permintaan saya tentang ekspor dalam bash .
Ogre Psalm33
1
Juga: superuser.com/questions/18988/…
Ogre Psalm33
Salah satu penggunaan yang umum adalah untuk menambahkan exportpernyataan ke .bashrc / .bash_profile untuk membuat variabel global persisten mirip dengan $HOME.
Evan Plaice
Hati-hati, ada lebih banyak cerita ini daripada yang awalnya muncul. Saya mengundang Anda untuk memeriksa jawaban saya.
jasonleonhard

Jawaban:

15

Dari man bash:

LINGKUNGAN HIDUP

Ketika suatu program dipanggil itu diberikan array string yang disebut lingkungan. Ini adalah daftar pasangan nama-nilai, dari bentuk nama = nilai.

Shell menyediakan beberapa cara untuk memanipulasi lingkungan. Pada permintaan, shell memindai lingkungannya sendiri dan membuat parameter untuk setiap nama yang ditemukan, secara otomatis menandainya untuk ekspor ke proses anak. Perintah yang dijalankan mewarisi lingkungan. The export dan declare -x perintah memungkinkan parameter dan fungsi yang akan ditambahkan ke dan dihapus dari lingkungan. Jika nilai parameter di lingkungan diubah, nilai baru menjadi bagian dari lingkungan, menggantikan yang lama. Lingkungan yang diwarisi oleh perintah apa pun yang dijalankan terdiri dari lingkungan awal shell, yang nilainya dapat dimodifikasi di shell, lebih sedikit pasangan yang dihapus oleh unset perintah, ditambah penambahan apa pun melalui ekspor dan declare -xperintah.

sml
sumber
74
Salin-tempel IMHO kutipan dari dokumentasi tanpa upaya tambahan untuk menjelaskan tidak boleh terbalik.
Artur
30
Kutipan itu tidak begitu jelas dan terus terang saya tidak mengerti apa yang sedang terjadi.
Trismegistos
4
@ Art: sebaliknya: jika dokumentasi (kutipan dari) menjawab pertanyaan, saya lebih suka tidak memiliki penjelasan tambahan.
René Nyffenegger
1
@ RenéNyffenegger tetapi tampaknya tidak. Setidaknya, saya tidak mengerti sampai saya membaca jawaban oleh BloodPhilia yang harus ditandai sebagai diterima.
Vladislav Rastrusny
1
Saya percaya poin Artur dan Trismegistos adalah siapa pun dapat menyalin, tidak selalu cukup, menjelaskan dan memberikan jawaban yang baik. Tidak masalah menyalin salinan dokumentasi atau memberikan tautan, bahkan dianjurkan, tetapi harus ada penjelasan kualitas tambahan. Lebih jauh, penjelasan itu dapat dengan mudah diabaikan oleh orang-orang seperti RenéNyffenegger jika mereka tidak membutuhkannya, tetapi itu akan ada untuk mereka yang akan mendapat manfaat darinya. Kita semua berusaha belajar dan memiliki cara berbeda untuk mendapatkan pemahaman, ini membantu mencakup berbagai gaya belajar dan akan meningkatkan peringkat Anda.
jasonleonhard
99

Variabel yang diekspor diteruskan ke proses anak, variabel yang tidak diekspor tidak.

BloodPhilia
sumber
Bisakah Anda arahkan ke dokumentasi yang memengaruhi itu. Saya mencari lebih banyak informasi dari itu. Misalnya, apakah suatu variabel hanya perlu diekspor satu kali, atau apakah Anda perlu mengekspornya setelah setiap perubahan, dll.
Chas. Owens
3
Anda dapat memverifikasi ini dengan menambahkan sesuatu ke jalur (katakan untuk PYTHONPATH) dan kemudian mencatat bahwa meskipun Anda bisa, echo $PYTHONPATHitu tidak akan dikenali oleh skrip python atau bash sampai Anda exportmelakukannya
Kaushik Ghose
Jawaban ini tampaknya tidak sepenuhnya benar juga. Sub-shell Bash, misalnya, adalah untuk proses anak (sesuai dengan $BASHPID) dan Anda dapat membaca variabel yang tidak diekspor dari shell induk. Bukti sederhana: x="y"; echo "$BASHPID: $x"; (echo "$BASHPID: $x") Dugaan saya adalah bahwa ini adalah kasus khusus yang terjadi ketika proses anak adalah sub-shell.
JepZ
20

Ketika Anda menggunakan export, Anda menambahkan variabel ke daftar variabel lingkungan shell di mana perintah ekspor dipanggil dan semua variabel lingkungan shell dilewatkan ke proses anak, itulah sebabnya Anda dapat menggunakannya.

Ketika Anda menyelesaikan shell, lingkungannya dihancurkan, itulah sebabnya variabel lingkungan dideklarasikan dan diekspor saat login, dalam file .bashrc misalnya

alfredozn
sumber