Bagaimana cara mengatur variabel lingkungan hanya selama skrip?

127

Di Linux (Ubuntu 11.04) di bash, apakah mungkin untuk sementara menetapkan variabel lingkungan yang hanya akan berbeda dari variabel normal selama skrip? Misalnya, dalam skrip shell, membuat aplikasi yang menyimpan ke HOME portabel dengan mengatur HOME ke folder untuk sementara di direktori kerja saat ini, lalu meluncurkan aplikasi.

Suchipi
sumber
5
Akan lebih sulit jika Anda ingin pengaturan bertahan melebihi durasi skrip
Nemo

Jawaban:

120
VAR1=value1 VAR2=value2 myScript args ...
Rockallite
sumber
2
Saya telah melakukan ini sendiri berkali-kali untuk berlari vblank_mode=0 glxgears. Ini berfungsi, tetapi juga mengatakan vblank_mode=0: command not foundsetelah berjalan, sedangkan prepending envtidak menyebabkan ini. [pengujian ...] Ternyata zsh tidak menyukainya (namun masih menggunakannya dengan benar), tetapi bash tidak masalah. Saya kira saya akan menggunakan envmetode ini mulai sekarang.
Chinoto Vokro
2
dengan skrip itu bekerja tetapi bagaimana VAR1="hello" echo $VAR1tidak mengembalikan apa-apa?
Zibri
2
@Zibri adalah tentang kapan ekspansi terjadi. Mungkin Anda dapat melakukan sesuatu seperti itu:VAR1="hello" bash -c 'echo $VAR1'
cybergrind
Suara positif untuk menunjukkan bahwa ini dimungkinkan bahkan untuk beberapa variabel lingkungan.
Binarus
70
env VAR=value myScript args ...
glenn jackman
sumber
18
AtauVAR=value myScript args ...
Rockallite
9
1. Kenapa PATH=$PATH:XYZ echo $PATH | grep XYZtidak ada keluaran? 2. Apa perbedaan antara menggunakan dan tidak menggunakan env?
qubodup
18
karena shell memperluas variabel PATH sebelum menjalankan perintah echo. Anda perlu menunda ekspansi itu. Satu cara: PATH=$PATH:XYZ sh -c 'echo $PATH' | grep XYZ- tanda kutip tunggal adalah kuncinya di sini
glenn jackman
14
Apa perbedaan antara menggunakan envdan tidak menggunakannya?
Mohammed Noureldin
Ini tampaknya tidak berhasil di satu orang sepertiIFS=$'\n' for l in lines; do ... done
drevicko
31

Taruh saja

export HOME=/blah/whatever

pada titik di skrip tempat Anda ingin perubahan terjadi. Karena setiap proses memiliki kumpulan variabel lingkungannya sendiri, definisi ini secara otomatis akan berhenti memiliki signifikansi apa pun ketika skrip berakhir (dan dengan itu contoh bash yang memiliki lingkungan yang berubah).

hmakholm meninggalkan Monica
sumber
11
Itu menyesatkan. exportakan meneruskan variabel ke subkulit, tetapi tidak mengontrol shell induk. Jika Anda menulis skrip yang diawali dengan "#! / Bin / sh" atau sejenisnya, variabel APA PUN yang Anda setel akan hilang saat skrip keluar.
brightlancer
1
@brightlancer, itu benar tetapi tampaknya tidak bertentangan dengan apa pun yang saya tulis. (Dengan pengecualian kemungkinan bahwa skrip mungkin memulai proses latar belakang, tapi saya pikir itu di luar tingkat kecanggihan OP dan hanya akan membingungkan).
hmakholm meninggalkan Monica
5
Ekspor tidak perlu. Juga, jawaban Anda hanya berfungsi jika skripnya memanggil penerjemah (#! / Bin / sh atau sejenisnya). Jika "naskah" -nya tidak, maka apa yang baru saja Anda katakan padanya akan bertahan melampaui akhir naskahnya. Itulah mengapa saya mengatakan jawaban Anda menyesatkan - mungkin benar, mungkin tidak, tetapi jelas ada bagian yang tidak perlu dan membingungkan karena dapat menyebabkan seseorang berpikir "ekspor" adalah elemen penting yang dia cari.
brightlancer
7
@brightlancer: Ekspor diperlukan jika skrip OP memanggil sub-skrip yang bergantung pada $ HOME, dan saya tidak berani berasumsi bahwa bukan itu masalahnya. Selanjutnya, bash akan menelurkan subkulit untuk menjalankan skrip meskipun skrip tersebut tidak memiliki baris shebang tetapi hanya berupa file teks dengan set bit eksekusi. Cobalah - tugas variabel dalam skrip tidak terlihat di shell tempat Anda memanggilnya. Hanya jika Anda secara eksplisit sourceskrip itu akan dieksekusi oleh shell yang sama tempat Anda mengetik perintah.
hmakholm meninggalkan Monica
4
@brightlancer: Ekspor diperlukan jika dia ingin $HOMEdiwarisi oleh perintah apa pun yang dijalankan dari skrip. Dan jika dia tidak melakukannya, dan pengaturan $HOMEhanya untuk kepentingan skrip itu sendiri, maka dia mungkin akan lebih baik memodifikasi skrip agar mengacu pada sesuatu selain $HOME.
Keith Thompson