Bir programı boş bir ortamda çalıştırmak istiyorum (örn. Değişken ayarlanmamış). Bash bu nasıl?
Bir programı boş bir ortamda çalıştırmak istiyorum (örn. Değişken ayarlanmamış). Bash bu nasıl?
Yanıtlar:
Bunu ile yapabilirsiniz env
:
env -i your_command
Aksine Aşağıdaki yorum, bu yapar çevre tamamen berrak, ancak engellemez your_command
yeni değişkenleri ayarlayarak. Özellikle, bir kabuğun çalıştırılması koşuya neden olur /etc/profile
ve kabuğun da bazı ayarları vardır.
Bunu şununla kontrol edebilirsiniz:
env -i env
yani çevreyi silin ve ardından yazdırın. Çıkış boş olacak.
echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.sh
baskılar /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
.
PATH
, PWD
ve SHLVL
Bash tarafından otomatik olarak ayarlanır. +1.
env -i bash --norc -c "declare -p PATH"
vermektedir declare -- PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
. Dışa aktarılan (ve dolayısıyla çevrenin bir parçası) için "-x" env -i bash --norc -c "export PATH; declare -p PATH"
declare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
İle "temiz" bir bash
ortam olabilirdi
$ env -i bash --noprofile --norc
env -i
Komut yürütülen program ortama eski kabuk çevre ihraç ortam değişken herhangi aktarmadan komut satırında ona verilen komutu yürütür.
Bu --noprofile
seçenek bash
, aksi takdirde bir giriş kabuğu için okunacak olan sistem genelindeki veya kişisel kabuk başlatma komut dosyalarının okunmasını engeller.
Bu --norc
seçenek bash
, aksi takdirde etkileşimli bir kabuk için okunacak olan kişisel kabuk başlatma komut dosyalarını okumayı durdurur .
env -i
mu? Hangi sistemdesin?
env
çevremi temizlemek ve --noprofile
/ etc / profile ve arkadaşlarının --norc
kaynağını önlemek ve ~ / .bashrc ve arkadaşlarının kaynağını önlemek.
env -i somecommand
ams daha önce de belirtildiği gibi boş bir ortamda bir komut çalıştırır .
Birçok program bazı önemli çevre değişkenlerine dayanır, bu nedenle bunları korumak isteyebilirsiniz:
env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand
Alternatif olarak, küçük bir giriş zamanı ortamına giriş yapabilirsiniz.
ssh localhost somecommand
env
desteklemiyor . --
env -i FOO=bar -- env
--
env -i -- FOO=bar env
aslında olmalı . Benim hatam. Bundan sonra --
işe başlamadığı için işe yaramaz -
.
Kabul edilen cevap doğru olsa da, genellikle yapmak istediğiniz şey:
env -i bash -l -c "printenv; and any other commands"
Bu size çıplak fakat işlevsel bash verir (etkileşimli olmayan modda giriş yaparken elde ettiğinizle aynı). Bu, örneğin dili, saat dilimini, GİRİŞ, vb. Ayarlar.
env -i
temizler HOME
, bu bash -l
sizin .bash_profile
vs.'nizi bulamıyor demektir . Yeni bir oturum açmaya başladığınıza benzer bir kabuk istiyorsanız, HOME
önce ayarlamak için ekstra bir yönlendirmeye ihtiyacınız var .
Buradaki çoğu cevabı olan sorun şu ki env -i
temizler HOME
, bash -l
içeriden koşsanız bile, vb . Okumaz .bash_profile
. Eğer aradığınız şey yeni bir giriş yapmış gibi davranan bir kabuksa, bunun yerine isterdim:
env -i HOME="$HOME" bash -l -c 'your_command'
Örnek:
$ 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
kabuk çalışacaktır .bash_login
ya .bash_profile
. Temiz bir ortam elde etmek için bu dosyaları içermeyen bir dizini kullanın --noprofile
veya ayarlayın HOME
. Sanırım "temiz" ile ne demek istediğine bağlı.
env -i bash -c ...
. Bu cevap özellikle, makineye yeni bir giriş yapmış gibi görünen bir kabuk istediğinizdedir.
Balki'nin yorumuna cevap vermek (ve süreçte kendi soruma cevap vermek :-):
% 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
o zaman şunu alıyorum:/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.