Jak uruchomić program w czystym środowisku w bash?


Odpowiedzi:


127

Możesz to zrobić za pomocą env:

env -i your_command

W przeciwieństwie do poniższych komentarzy, to całkowicie usuwa środowisko, ale nie przeszkadza w your_commandustawianiu nowych zmiennych. W szczególności uruchomienie powłoki spowoduje jej /etc/profileuruchomienie, a powłoka może mieć także pewne wbudowane ustawienia.

Możesz to sprawdzić za pomocą:

env -i env

tj. wytrzyj środowisko, a następnie wydrukuj je. Dane wyjściowe będą puste.


4
Nie usuwa całkowicie środowiska: echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.shdrukuje /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin.
l0b0

2
Wydaje się jednak, jest to najbliżej można dostać - Wydaje się zmiennych, takich jak PATH, PWDi SHLVLsą ustawiane automatycznie przez bash. +1.
l0b0

3
@ I0b0: Zobacz moją edycję.
dniu

3
Zmienna PATH w skrypcie pierwszego komentującego nie znajduje się w środowisku i dlatego nie jest zmienną środowiskową. Bash najwyraźniej ustawia własną zmienną powłoki o nazwie PATH, jeśli nie ma dla niej żadnej wyeksportowanej: env -i bash --norc -c "declare -p PATH"daje declare -- PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.". Zwróć uwagę na „-x” dla wyeksportowanego (a zatem i części środowiska), jeśli wyeksportujesz go sam: env -i bash --norc -c "export PATH; declare -p PATH"dajedeclare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
Binary Phile

34

bashMożna mieć „czyste” środowisko

$ env -i bash --noprofile --norc
  • env -iPolecenie wykonuje polecenie nadane mu w wierszu poleceń bez przenoszenia dowolnego eksportowanych zmiennych środowiskowych starego środowisku powłoki do środowiska wykonywanego programu.

  • --noprofileOpcja przestaje bashod czytania skryptów systemowych lub osobistych inicjalizacji powłoki, które w przeciwnym razie byłyby czytelne dla powłoki logowania.

  • --norcOpcja przestaje bashczytając osobiste powłoki skrypty inicjujące, które w przeciwnym razie byłyby czytelne dla interaktywnej powłoki.


Moja env nie rozpoznaje tych opcji.
Paulo Carvalho

@PauloCarvalho Twój system nie obsługuje env -i? W jakim systemie jesteś?
Kusalananda

Przepraszamy, działa w powłoce. Próbowałem umieścić go w skrypcie i jakoś to spowodowało błąd.
Paulo Carvalho,

@PauloCarvalho Przepraszamy, nie widzę wpisanego polecenia ani błędu.
Kusalananda

Świetnie - właśnie tego szukałem. envw celu oczyszczenia mojego środowiska oraz --noprofileuniknięcia pozyskiwania / etc / profilu i przyjaciół oraz --norcunikania pozyskiwania ~ / .bashrc i przyjaciół.
Felipe Alvarez

28

env -i somecommanduruchamia polecenie w pustym środowisku, jak już wspomniał ams .

Wiele programów opiera się na niektórych ważnych zmiennych środowiskowych, więc warto je zachować:

env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand

Alternatywnie możesz zalogować się do małego środowiska do logowania.

ssh localhost somecommand

1
Działa podczas uruchamiania polecenia na cmdline. Jak umieścić to w shebang ?, wydaje się, że nie działa !
balki

Dziwne, moje envnie obsługuje --rozgraniczania i env -i FOO=bar -- envpodejmowania prób uruchomienia polecenia o nazwie --.
antak

@antak Tak powinno być env -i -- FOO=bar env. Mój błąd. Nie --jest to przydatne, ponieważ to, co następuje, nie zaczyna się od -.
Gilles

Nie zdawałem sobie sprawy, że zawsze możesz ssh w localhost, to trochę dziwne. Jaki jest tam przypadek użycia.
Edgar Aroutiounian

@EdgarAroutiounian Możesz SSH do localhost, jeśli jest uruchomiony serwer SSH. Dlaczego programiści mieliby się starać to zabronić?
Gilles

4

Chociaż zaakceptowana odpowiedź jest prawidłowa, zwykle chcesz:

env -i bash -l -c "printenv; and any other commands"

To daje ci nagą, ale funkcjonalną bash (taką samą, jak przy logowaniu w trybie nieinteraktywnym). To na przykład ustawia język, strefę czasową, HOME itp.


To nie do końca działa, ponieważ env -iczyści HOME, co oznacza, że bash -lnie można znaleźć Twojego .bash_profileitp. Jeśli chcesz powłoki podobnej do tej, którą otrzymujesz przy nowym logowaniu, potrzebujesz dodatkowej pośredniczości, aby ustawić ją jako HOMEpierwszą.
Elliott Slaughter


1

Problem z większością odpowiedzi tutaj jest taki , że env -iusuwa się HOME, więc nawet jeśli biegniesz bash -lw środku, nie przeczyta twojego .bash_profileitp. Jeśli szukasz powłoki, która działa tak, jakbyś właśnie zrobił nowe logowanie, zamiast tego chciałbym tego:

env -i HOME="$HOME" bash -l -c 'your_command'

Przykład:

$ 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
Zauważ, że bashpowłoka logowania uruchomi się .bash_loginlub .bash_profile. Aby uzyskać czyste środowisko, użyj --noprofilelub ustaw HOMEkatalog, w którym nie ma tych plików. Przypuszczam, że zależy to od tego, co rozumiesz przez „czysty”.
Kusalananda

1
Tak, jeśli chcesz powłoki bez dosłownie niczego, po prostu postępuj zgodnie z oryginalną odpowiedzią i zrób env -i bash -c .... Ta odpowiedź jest szczególnie gdy potrzebujesz powłoki, która wygląda tak, jakbyś właśnie zrobił nowe logowanie na maszynie.
Elliott Slaughter

0

Aby odpowiedzieć na komentarz Balki (i odpowiedzieć na moje własne pytanie w tym procesie :-):

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

Kiedy próbuję tego w mojej linii shebang w CentOS 7.6, otrzymuję ten błąd z env:/usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
ScottJ

Jeśli zmienię skrypt, aby używał długiego argumentu --ignore-environment, otrzymam to:/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.
ScottJ
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.