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_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:
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.sh
cetakan /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
.
PATH
, PWD
dan SHLVL
disetel 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" bash
mungkin ada bersama
$ env -i bash --noprofile --norc
The 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 berhenti bash
dari membaca seluruh sistem atau shell inisialisasi pribadi skrip yang seharusnya dapat membaca untuk login shell.
The --norc
pilihan berhenti bash
dari membaca shell script inisialisasi pribadi yang seharusnya dapat dibaca untuk shell interaktif.
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:
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
env
tidak mendukung --
pembatasan dan melakukan env -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.
env -i
membersihkan HOME
, yang berarti bash -l
tidak dapat menemukan .bash_profile
dll Anda . Jika Anda ingin shell seperti yang Anda dapatkan pada login baru, Anda perlu tipuan ekstra untuk ditetapkan HOME
terlebih dahulu.
Masalah dengan kebanyakan jawaban di sini adalah bahwa env -i
Clears HOME
, sehingga bahkan jika Anda menjalankan bash -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:
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
bash
shell login akan berjalan .bash_login
atau .bash_profile
. Untuk mendapatkan lingkungan yang bersih, gunakan --noprofile
, atau atur HOME
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 :-):
% 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-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.