Apa perbedaan antara env, setenv, ekspor, dan kapan digunakan?

18

Baru-baru ini saya perhatikan kami memiliki 3 opsi untuk mengatur variabel lingkungan:

  1. export envVar1=1
  2. setenv envVar2=2
  3. env envVAr3=3

Jika ada cara lain, mohon beri tahu kami.

Kapan saya harus memilih yang satu daripada yang lain? Mohon saran pedoman.

Adapun kompatibilitas shell, mana yang paling ekspansif (mencakup lebih banyak dialek shell)?

Saya sudah memperhatikan jawaban ini tetapi saya ingin memperluas pertanyaan dengan envdan pedoman preferensi penggunaan.

Maroshi
sumber

Jawaban:

14

export VARIABLE_NAME='some value'adalah cara untuk mengatur variabel lingkungan dalam shell POSIX-compliant ( sh, dash, bash, ksh, dll .; juga zsh). Jika variabel sudah memiliki nilai, Anda dapat menggunakannya export VARIABLE_NAMEuntuk menjadikannya variabel lingkungan tanpa mengubah nilainya.

Pra-POSIX Shell Bourne tidak mendukung ini, itulah sebabnya Anda akan melihat skrip yang menghindari export VARIABLE_NAME='some value'dan menggunakannya VARIABLE_NAME='some value'; export VARIABLE_NAME. Tapi cangkang Bourne pra-POSIX sangat langka saat ini.

setenv VARIABLE_NAME='some value'adalah sintaks csh untuk mengatur variabel lingkungan. setenvtidak ada di sh, dan csh sangat jarang digunakan dalam skrip dan telah dilampaui oleh bash untuk penggunaan interaktif selama 20 tahun terakhir (dan zsh bahkan lebih lama), sehingga Anda dapat melupakannya kecuali Anda menjumpainya.

The envperintah sangat jarang berguna kecuali dalam garis peristiwa . Ketika dipanggil tanpa argumen, ini menampilkan lingkungan, tetapi exportapakah itu lebih baik (diurutkan, dan sering dikutip untuk mengaburkan baris baru dalam nilai dari baris baru yang memisahkan nilai). Ketika dipanggil dengan argumen, itu menjalankan perintah dengan variabel lingkungan tambahan, tetapi perintah yang sama tanpa envjuga berfungsi ( VAR=value mycommandberjalan mycommanddengan VARset ke value, sama seperti env VAR=value mycommand). Alasannya envberguna dalam baris shebang adalah bahwa ia melakukan PATHpencarian, dan kebetulan tidak melakukan hal lain ketika dipanggil dengan nama perintah. The envperintah dapat berguna untuk menjalankan perintah dengan hanya beberapa variabel lingkungan dengan-i, atau tanpa parameter untuk menampilkan lingkungan termasuk variabel dengan nama tidak valid yang shell tidak impor.

Gilles 'SO- berhenti menjadi jahat'
sumber
3

Menetapkan variabel seperti VAR='asdf'membiarkan lingkungan tidak dimodifikasi, artinya program yang Anda luncurkan di sesi yang sama tidak akan tahu apa-apa VARdan tidak akan dapat mengaksesnya. Anda menginginkan perilaku ini saat menulis skrip shell.

export, di sisi lain, adalah bash builtin yang memodifikasi lingkungan sehingga membuat variabel yang diekspor terlihat untuk proses anak yang muncul dalam sesi saat ini. Anda dapat mencapai hal yang sama dengan berlari VAR='asdf' %program_name%.

envbukan builtin, tetapi sebuah program dengan sendirinya. Di permukaan ia bekerja persis seperti ketika Anda VAR='asdf' %program_name%, tetapi pada tingkat yang lebih rendah hal menjadi sedikit lebih rumit. Pertama, envdiluncurkan. Ini memodifikasi lingkungan, kemudian mengeksekusi perintah dengan argumen yang diberikan. Perilaku yang sama Anda dapat mencapai kode Anda sendiri dengan menggunakan panggilan sistem exec (3) .

setenvhanya exportdalam csh-family shells, seperti yang dinyatakan dalam jawaban Anda.

pengguna230253
sumber
2
Dalam shell modern, VAR=asdfperbarui lingkungan jika VARsudah ada di lingkungan. (Ini tidak benar dalam kulit Bourne asli.)
Gilles 'SO-stop being evil'