Bagaimana saya bisa membuat variabel lingkungan "diekspor" di skrip shell bertahan?

54

Saya memiliki beberapa akun Amazon EC2 dan ingin cepat dapat beralih variabel, seperti $EC2_HOME, menggunakan skrip.

Saya memiliki skrip shell yang diatur seperti ini:

#!/bin/sh
export EC2_HOME=/home/me/.ec2
echo $EC2_HOME

Ketika saya menjalankan skrip saya tahu itu EC2_HOMEsudah diatur, tetapi saya berpikir bahwa menggunakan exportakan membuat variabel tetap ada setelah skrip selesai. Tidak, karena berlari echo $EC_HOMEtidak menunjukkan apa-apa.

Saya tahu ini pasti pengetahuan scripting Linux yang sangat dasar, tetapi saya tidak mengetahuinya. Saya mencoba mencari pertanyaan terkait tanpa hasil - jadi saya minta maaf jika ini adalah duplikat.

cwd
sumber

Jawaban:

60

Anda harus sumber skrip Anda, dengan

. ./script

atau

source ./script
enzotib
sumber
19
alasannya adalah bahwa skrip Anda memunculkan proses shell baru sebagai anak dari shell saat ini. Setiap perubahan lingkungan yang Anda buat dalam proses anak tidak dapat memengaruhi orang tua. Saat Anda menggunakan .atau source, Anda tidak melahirkan proses anak baru, Anda menjalankan perintah di shell saat ini.
glenn jackman
1
@ glennjackman Saya memiliki masalah yang sama dan saya telah mencoba solusi Anda tetapi log saya dari shell ketika saya melakukannya .atau source. Mengapa ini terjadi?
Patryk
7
@ Patryk: mungkin skrip Anda memiliki exitpernyataan, jadi tidak cocok untuk diambil sumbernya.
enzotib
Sementara source ./scriptbekerja dengan sangat baik, sudo source ./script.shkata sudo: source: command not found. Bagaimana saya bisa melakukan ini menggunakan sudo?
71GA
1
@ 71GA: tergantung pada preferensi kompilasi untuk sudodan tergantung pada pengaturan konfigurasi di /etc/sudoersAnda dapat atau tidak dapat menjaga lingkungan Anda saat menjalankan perintah dengan sudo. Saya sarankan Anda untuk mencoba sumber skrip Anda, dan kemudian jalankan sudodengan -Eopsi untuk melestarikan lingkungan. Jika tidak berhasil, saya kira ada sangat sedikit yang dapat Anda lakukan.
enzotib
35

Saat Anda menjalankan skrip, skrip tersebut akan mendapatkan shellnya sendiri dan lingkungannya sendiri, yang menghilang lagi segera setelah skrip selesai. Untuk menjaga variabel lingkungan sekitar, sumber skrip ke shell Anda saat ini:

$ source ./a.sh

atau setara (tapi sedikit lebih portable) gunakan perintah POSIX dot :

$ . ./a.sh

Kemudian definisi akan dimasukkan ke dalam lingkungan shell Anda saat ini dan diwarisi oleh program apa pun yang Anda luncurkan darinya.

Agar lebih dekat dengan menjalankan skrip, . a.shakan menemukan a.sh dengan mencari direktori di PATHvariabel lingkungan.


Ada beberapa seluk-beluk dalam bagaimana ini berperilaku, dan apakah .dan sourceitu sama (atau ada sama sekali). . ./a.shpasti akan berperilaku sama di setiap shell yang kompatibel dengan POSIX, tetapi sourcedan ., dan . a.shdan . ./a.sh, dapat bervariasi. Untuk Bash sourcedan .sama dalam semua kasus; untuk zsh sourceselalu memeriksa direktori saat ini terlebih dahulu ; ksh pada dasarnya serupa.

Jika nama skrip diberikan sebagai path (berisi a /), path itu digunakan secara langsung dalam semua kasus. Hal yang paling dapat diandalkan untuk dilakukan adalah . ./scriptatau . /path/to/script.

Michael Homer
sumber
1

Hanya sebagai catatan.

Jika Anda ingin menjalankan skrip dari internet yang mengekspor env ke sistem

Anda dapat menggunakan format berikut

source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)

Sebagai contoh:

source <(curl -s -L https://example.com/install.sh)
toffee
sumber
Terlihat berbahaya tetapi bermanfaat jika Anda mempercayai skrip itu!
Mark Stewart