Apa yang dilakukan 'set' dan 'ekspor' oleh bash-builtin?

46

Saya sedikit bingung dengan tujuan setdan exportdi Bash (dan saya kira mungkin juga kerang lain).

Saya akan berpikir itu untuk mengatur variabel lingkungan, tetapi itu bisa dilakukan hanya dengan VARIABLE=VALUE, kan?

Mengetik setdan juga exportmenampilkan nilai yang berbeda.

Jadi apa tujuan mereka?

mydoghasworms
sumber
Saya selalu memulai dengan skrip bash dengan dua berikut ini. #! / usr / bin / env bash set -euxo pipefail Tautan ini menjelaskan hal yang sama. coderwall.com/p/fkfaqq/…
147.3k

Jawaban:

50

exportekspor ke anak-anak dari proses saat ini, secara default mereka tidak diekspor. Sebagai contoh:

$ foo=bar
$ echo "$foo"
bar
$ bash -c 'echo "$foo"'

$ export foo
$ bash -c 'echo "$foo"'
bar

set, di sisi lain, menetapkan atribut shell, misalnya, parameter posisi.

$ set foo=baz
$ echo "$1"
foo=baz

Catatan yang baztidak ditugaskan foo, itu hanya menjadi parameter posisi literal. Ada banyak hal lain yang setbisa dilakukan (kebanyakan opsi shell), lihat help set.

Sedangkan untuk mencetak, exportdipanggil tanpa argumen mencetak semua variabel di lingkungan shell. setjuga mencetak variabel yang tidak diekspor. Itu juga dapat mengekspor beberapa objek lain (walaupun Anda harus perhatikan bahwa ini bukan portable), lihat help export.

Chris Down
sumber
Terima kasih itu jawaban yang sangat berguna. Namun, ketika saya mengatur http_proxy hanya dengan http_proxy = abc.com , itu terlihat oleh proses anak, misalnya menjalankan wget tanpa saya mengekspornya. Bagaimana ini bisa terjadi?
mydoghasworms
2
@ mydoghasworms Dua kemungkinan alasan. Satu, Anda menjalankan perintah sebagai foo=bar command. Ini adalah ekspor implisit untuk satu perintah. Kemungkinan kedua adalah yang http_proxysudah diekspor di lingkungan Anda sebelum Anda memodifikasinya.
Chris Down
Ah ya, kamu benar. Cemerlang, terima kasih!
mydoghasworms
6

Lihat help set: set digunakan untuk mengatur atribut shell dan atribut posisi.

Variabel yang tidak diekspor tidak diwarisi oleh proses anak. exportdigunakan untuk menandai variabel untuk ekspor.

choroba
sumber