Saya ingin menjalankan program di lingkungan kosong (yaitu tanpa envariables yang ditetapkan). Bagaimana melakukan ini di bash?
bash
environment-variables
Eugene Yarmash
sumber
sumber
Jawaban:
Anda dapat melakukan ini dengan
env
:Bertentangan dengan komentar di bawah ini, ini benar - benar membersihkan lingkungan, tetapi tidak mencegah
your_command
pengaturan variabel baru. Secara khusus, menjalankan shell akan menyebabkannya/etc/profile
berjalan, dan shell mungkin memiliki beberapa pengaturan bawaan juga.Anda dapat memeriksanya dengan:
yaitu menghapus lingkungan dan kemudian mencetaknya. Output akan kosong.
sumber
echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.sh
cetakan/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
.PATH
,PWD
danSHLVL
disetel secara otomatis oleh Bash. +1.env -i bash --norc -c "declare -p PATH"
memberideclare -- PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
. Perhatikan "x" untuk diekspor (dan karena itu bagian dari lingkungan) jika Anda mengekspor sendiri:env -i bash --norc -c "export PATH; declare -p PATH"
memberikandeclare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
Lingkungan "bersih"
bash
mungkin ada bersamaThe
env -i
perintah mengeksekusi perintah yang diberikan untuk itu pada baris perintah tanpa mentransfer setiap variabel lingkungan diekspor dari lingkungan shell lama ke lingkungan dari program dieksekusi.The
--noprofile
pilihan berhentibash
dari membaca seluruh sistem atau shell inisialisasi pribadi skrip yang seharusnya dapat membaca untuk login shell.The
--norc
pilihan berhentibash
dari membaca shell script inisialisasi pribadi yang seharusnya dapat dibaca untuk shell interaktif.sumber
env -i
? Sistem apa yang Anda pakai?env
untuk membersihkan lingkungan saya, dan--noprofile
untuk menghindari sumber / etc / profil dan teman-teman, dan--norc
untuk menghindari sumber ~ / .bashrc dan teman-teman.env -i somecommand
menjalankan perintah di lingkungan kosong, seperti yang telah disebutkan oleh ams .Banyak program bergantung pada beberapa variabel lingkungan penting, jadi Anda mungkin ingin mempertahankannya:
Atau, Anda bisa masuk ke lingkungan waktu masuk yang kecil.
sumber
env
tidak mendukung--
pembatasan dan melakukanenv -i FOO=bar -- env
upaya untuk menjalankan perintah bernama--
.env -i -- FOO=bar env
, sebenarnya. Salahku. Bukan berarti--
itu berguna karena apa yang mengikutinya tidak dimulai dengan-
.Meskipun jawaban yang diterima benar, yang biasanya ingin Anda lakukan adalah:
env -i bash -l -c "printenv; and any other commands"
Ini memberi Anda bash kosong tapi fungsional (sama seperti yang Anda dapatkan saat masuk dalam mode non-interaktif). Ini misalnya mengatur bahasa, zona waktu, HOME, dll.
sumber
env -i
membersihkanHOME
, yang berartibash -l
tidak dapat menemukan.bash_profile
dll Anda . Jika Anda ingin shell seperti yang Anda dapatkan pada login baru, Anda perlu tipuan ekstra untuk ditetapkanHOME
terlebih dahulu.Masalah dengan kebanyakan jawaban di sini adalah bahwa
env -i
ClearsHOME
, sehingga bahkan jika Anda menjalankanbash -l
di dalam, itu akan tidak membaca Anda.bash_profile
dll Jika apa yang Anda cari adalah shell yang bertindak sebagai jika Anda baru saja melakukan login segar, Anda Saya ingin ini sebagai gantinya:Contoh:
sumber
bash
shell login akan berjalan.bash_login
atau.bash_profile
. Untuk mendapatkan lingkungan yang bersih, gunakan--noprofile
, atau aturHOME
ke direktori yang tidak memiliki file-file itu. Saya kira itu tergantung pada apa yang Anda maksud dengan "bersih".env -i bash -c ...
. Jawaban ini khusus ketika Anda ingin shell yang sepertinya Anda baru saja melakukan login baru di mesin.Untuk menjawab komentar balki (dan menjawab pertanyaan saya sendiri dalam proses :-):
sumber
/usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
--ignore-environment
maka saya mendapatkan ini:/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.