Saya ingin menjalankan program di lingkungan kosong (yaitu tanpa envariables yang ditetapkan). Bagaimana melakukan ini di bash?
Saya ingin menjalankan program di lingkungan kosong (yaitu tanpa envariables yang ditetapkan). Bagaimana melakukan ini di bash?
Jawaban:
Anda dapat melakukan ini dengan env:
env -i your_command
Bertentangan dengan komentar di bawah ini, ini benar - benar membersihkan lingkungan, tetapi tidak mencegah your_commandpengaturan variabel baru. Secara khusus, menjalankan shell akan menyebabkannya /etc/profileberjalan, dan shell mungkin memiliki beberapa pengaturan bawaan juga.
Anda dapat memeriksanya dengan:
env -i env
yaitu menghapus lingkungan dan kemudian mencetaknya. Output akan kosong.
echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.shcetakan /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin.
PATH, PWDdan SHLVLdisetel secara otomatis oleh Bash. +1.
env -i bash --norc -c "declare -p PATH"memberi declare -- 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" bashmungkin ada bersama
$ env -i bash --noprofile --norc
The env -iperintah 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 --noprofilepilihan berhenti bashdari membaca seluruh sistem atau shell inisialisasi pribadi skrip yang seharusnya dapat membaca untuk login shell.
The --norcpilihan berhenti bashdari membaca shell script inisialisasi pribadi yang seharusnya dapat dibaca untuk shell interaktif.
env -i? Sistem apa yang Anda pakai?
envuntuk membersihkan lingkungan saya, dan --noprofileuntuk menghindari sumber / etc / profil dan teman-teman, dan --norcuntuk menghindari sumber ~ / .bashrc dan teman-teman.
env -i somecommandmenjalankan perintah di lingkungan kosong, seperti yang telah disebutkan oleh ams .
Banyak program bergantung pada beberapa variabel lingkungan penting, jadi Anda mungkin ingin mempertahankannya:
env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand
Atau, Anda bisa masuk ke lingkungan waktu masuk yang kecil.
ssh localhost somecommand
envtidak mendukung --pembatasan dan melakukan env -i FOO=bar -- envupaya 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.
env -imembersihkan HOME, yang berarti bash -ltidak dapat menemukan .bash_profiledll Anda . Jika Anda ingin shell seperti yang Anda dapatkan pada login baru, Anda perlu tipuan ekstra untuk ditetapkan HOMEterlebih dahulu.
Masalah dengan kebanyakan jawaban di sini adalah bahwa env -iClears HOME, sehingga bahkan jika Anda menjalankan bash -ldi dalam, itu akan tidak membaca Anda .bash_profiledll Jika apa yang Anda cari adalah shell yang bertindak sebagai jika Anda baru saja melakukan login segar, Anda Saya ingin ini sebagai gantinya:
env -i HOME="$HOME" bash -l -c 'your_command'
Contoh:
$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123
bashshell login akan berjalan .bash_loginatau .bash_profile. Untuk mendapatkan lingkungan yang bersih, gunakan --noprofile, atau atur HOMEke 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 :-):
% echo Environment in calling shell: vars: $(env |wc -l); echo; ./du; echo; cat du
Environment in calling shell: vars: 43
==> This is the environment: vars: 5
PATH="$PATH"
PWD=/Users/nick
SHLVL=1
SOMETHING_TO_KEEP="$USER"
_=/usr/bin/env
==> The end.
#!/usr/bin/env -i SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh
echo "==> This is the environment: vars:" $(/usr/bin/env | /usr/bin/wc -l)
/usr/bin/env
echo "==> The end."
/usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
--ignore-environmentmaka 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.