Bir program bash içinde temiz bir ortamda nasıl çalıştırılır?


Yanıtlar:


127

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.


4
Çevreyi tamamen temizlemiyor: 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.
l0b0

2
Ancak, bu alabileceğiniz en yakın görünüyor - Bu gibi değişkenler gibi görünüyor PATH, PWDve SHLVLBash tarafından otomatik olarak ayarlanır. +1.
l0b0

3
@ I0b0: Düzenlememe bakın.
ams

3
İlk yorumun komut dosyasındaki PATH değişkeni ortamda değil ve bu nedenle bir ortam değişkeni değil. Bash görünüşte bunun için ihraç biri yoksa YOLU denilen kendi normal kabuk değişkeni ayarlar: 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:."
ifadesini

34

İ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'im bu seçenekleri tanımıyor.
Paulo Carvalho

@ PauloCarvalho Sisteminiz desteklemiyor env -imu? Hangi sistemdesin?
Kusalananda

Üzgünüz, kabukta çalışıyor. Bir senaryoya koymayı denedim ve bir şekilde hata yaptı.
Paulo Carvalho

@PauloCarvalho Üzgünüz, hangi komutu yazdığınızı veya neyin yanlış olduğunu göremiyorum.
Kusalananda

Harika - tam aradığım şeydi. 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.
Felipe Alvarez

28

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

1
Cmdline'da komutu çalıştırırken çalışır. Nasıl görünmüyor ?, ben shebang bu koyacağım çalışmak !
balki

Garip, benim sınırlandırmayı ve adında bir komut çalıştırma girişimlerini envdesteklemiyor . --env -i FOO=bar -- env--
antak

@antak Bu env -i -- FOO=bar envaslında olmalı . Benim hatam. Bundan sonra --işe başlamadığı için işe yaramaz -.
Gilles

Her zaman localhost'a bulabileceğinizi bilmiyordunuz, bu çok garip. Oradaki kullanım durumu ne?
Edgar Aroutiounyan

@EdgarAroutiounian Bir SSH sunucusu çalışıyorsa, SSH'yi localhost'a ekleyebilirsiniz. Programcılar neden yasaklama çabasından geçiyorlar?
Gilles

4

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.


Bu pek işe yaramadı çünkü 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 .
Elliott Slaughter


1

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

1
Bir giriş unutmayın 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ı.
Kusalananda

1
Evet, kelimenin tam anlamıyla hiçbir şey içermeyen bir kabuk istiyorsanız, sadece orijinal cevabı takip edin ve yapın env -i bash -c .... Bu cevap özellikle, makineye yeni bir giriş yapmış gibi görünen bir kabuk istediğinizdedir.
Elliott Slaughter

0

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."

Bunu CentOS /usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
7.6'daki shebang hattımda denediğimde

Eğer uzun argümanı kullanmak için senaryoyu değiştirirsem, --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.
ScottJ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.