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_commandyeni değişkenleri ayarlayarak. Özellikle, bir kabuğun çalıştırılması koşuya neden olur /etc/profileve 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.shbaskılar /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin.
PATH, PWDve SHLVLBash 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 bashortam olabilirdi
$ env -i bash --noprofile --norc
env -iKomut 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 --noprofileseç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 --norcseçenek bash, aksi takdirde etkileşimli bir kabuk için okunacak olan kişisel kabuk başlatma komut dosyalarını okumayı durdurur .
env -imu? Hangi sistemdesin?
envçevremi temizlemek ve --noprofile/ etc / profile ve arkadaşlarının --norckaynağını önlemek ve ~ / .bashrc ve arkadaşlarının kaynağını önlemek.
env -i somecommandams 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
envdesteklemiyor . --env -i FOO=bar -- env--
env -i -- FOO=bar envaslı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 -itemizler HOME, bu bash -lsizin .bash_profilevs.'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 -itemizler HOME, bash -liç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
bashkabuk çalışacaktır .bash_loginya .bash_profile. Temiz bir ortam elde etmek için bu dosyaları içermeyen bir dizini kullanın --noprofileveya 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-environmento 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.