Perbedaan antara "a = b" dan "ekspor a = b" dalam bash

50

Apa perbedaan antara:

a=b

dan

export a=b

Di bash?

Saya mengerti bahwa keduanya mendefinisikan variabel lingkungan, tetapi saya tidak sepenuhnya memahami perbedaannya.

Adam Matan
sumber
Bisakah seseorang mengedit ini? Ini sama sekali tidak terkait dengan Linux, tetapi hanya bergantung pada shell yang Anda gunakan. Saya kira itu bash di sini, yang juga berfungsi pada Windows.
innaM
Saya berdiri dikoreksi.
Adam Matan

Jawaban:

54

export menyebarkan variabel ke subproses.

Misalnya, jika Anda melakukannya

FOO=bar

maka subproses yang memeriksa FOO tidak akan menemukan variabel sedangkan

export FOO=bar

akan memungkinkan subproses untuk menemukannya.

Tetapi jika FOOtelah sudah didefinisikan sebagai variabel lingkungan, maka FOO=barakan mengubah nilai dari variabel lingkungan.

Sebagai contoh:

FOO=one     # Not an environment variable
export FOO  # Now FOO is an environment variable
FOO=two     # Update the environment variable, so sub processes will see $FOO = "two"

Kerang yang lebih tua tidak mendukung export FOO=barsintaksis; kamu harus menulis FOO=bar; export FOO.

Mike McQuaid
sumber
33
Sebenarnya, jika Anda tidak menggunakan " export", Anda tidak mendefinisikan variabel lingkungan, tetapi hanya variabel shell. Variabel Shell hanya tersedia untuk proses shell; variabel lingkungan tersedia untuk setiap proses selanjutnya, bukan hanya shell. Selain itu, subkulit adalah perintah yang terdapat di dalam tanda kurung, yang memang memiliki akses ke variabel shell, sedangkan yang Anda bicarakan adalah proses anak yang merupakan shell.
wfaulk
Di mana ini disimpan?
HDave
28

Jika Anda tidak menggunakan export, Anda tidak mendefinisikan variabel lingkungan; hanya variabel shell.

Variabel Shell hanya tersedia untuk proses shell; variabel lingkungan tersedia untuk setiap proses selanjutnya, bukan hanya shell.

wfaulk
sumber
2

Juga, jika Anda ingin agar variabel tersedia untuk shell panggilan tanpa menggunakan ekspor, Anda dapat melakukan ini:

File a.ksh adalah -

#!/bin/ksh
FOO=bar

Pada prompt, jalankan ini

> . a.ksh

Ini akan menjalankan perintah di dalam shell yang sama dan $ FOO akan tersedia.

Sedangkan,

> a.ksh

Akan membuat $ FOO hanya tersedia dalam a.ksh, setelah panggilan ke a.ksh itu tidak akan ada.

alok
sumber
1
Benar. Perhatikan bahwa "." hanyalah jalan pintas untuk "sumber", yang terkadang digunakan dalam skrip untuk keterbacaan yang lebih baik. Lihat "bantuan." atau "sumber bantuan" untuk detail.
sleske
1

Selain apa yang sudah dijawab, kedua pernyataan ini tidak harus mendefinisikan (yaitu membuat vs set) variabel lingkungan sebagai "a" mungkin sudah ada sebagai variabel shell atau lingkungan.

Dalam kasus yang terakhir, kedua pernyataan tersebut sangat setara.

Jlliagre
sumber