Я хочу запустить программу в пустой среде (то есть без установленных переменных). Как это сделать в Bash?
Я хочу запустить программу в пустой среде (то есть без установленных переменных). Как это сделать в Bash?
Ответы:
Вы можете сделать это с env
:
env -i your_command
В отличие от комментариев ниже, это делает совершенно ясно из окружающей среды, но это не мешает your_command
установить новые переменные. В частности, запуск оболочки вызовет /etc/profile
запуск, и оболочка может иметь также некоторые встроенные настройки.
Вы можете проверить это с:
env -i env
т.е. протрите окружающую среду и затем напечатайте это. Вывод будет пустым.
echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.sh
печатает /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
.
PATH
, PWD
и SHLVL
устанавливаются автоматически Bash. +1.
env -i bash --norc -c "declare -p PATH"
give declare -- PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
. Обратите внимание на «-x» для экспортируемой (и, следовательно, части среды), если вы экспортируете ее самостоятельно: env -i bash --norc -c "export PATH; declare -p PATH"
givedeclare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
«Чистая» bash
среда может иметь место с
$ env -i bash --noprofile --norc
Команда env -i
выполняет команду, переданную ей в командной строке, без передачи каких-либо экспортированных переменных среды старой среды оболочки в среду исполняемой программы.
Эта --noprofile
опция останавливает bash
чтение общесистемных или личных сценариев инициализации оболочки, которые в противном случае считывались бы для оболочки входа в систему.
Эта --norc
опция останавливает bash
чтение сценариев инициализации личной оболочки, которые в противном случае считывались бы для интерактивной оболочки.
env -i
? На какой ты системе?
env
чтобы очистить мою среду, и --noprofile
избежать поиска / etc / profile и друзей, и --norc
избежать поиска ~ / .bashrc и друзей.
env -i somecommand
запускает команду в пустой среде, как уже упоминалось в ams .
Многие программы используют некоторые важные переменные среды, поэтому вы можете захотеть сохранить их:
env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand
Кроме того, вы можете войти в небольшую среду входа в систему.
ssh localhost somecommand
env
не поддерживает --
разграничение и env -i FOO=bar -- env
попытки запуска команды с именем --
.
env -i -- FOO=bar env
самом деле. Виноват. Не то, чтобы --
это было полезно, поскольку то, что следует, не начинается с -
.
Хотя принятый ответ правильный, обычно вы хотите:
env -i bash -l -c "printenv; and any other commands"
Это дает вам простой, но функциональный bash (такой же, какой вы получили бы при входе в неинтерактивный режим). Это, например, устанавливает язык, часовой пояс, HOME и т. Д.
env -i
очищает HOME
, что означает, что bash -l
вы не можете найти ваш .bash_profile
и т. Д. Если вам нужна оболочка, похожая на ту, которую вы получили бы при новом входе в систему, вам нужно установить дополнительное косвенное указание в HOME
первую очередь.
Проблема с большинством ответов здесь в том, что она env -i
очищается HOME
, поэтому, даже если вы запустите bash -l
ее изнутри, она не будет читать ваши .bash_profile
и т. Д. Если вы ищете оболочку, которая действует так, как будто вы только что сделали новый вход в систему, вы хотел бы вместо этого:
env -i HOME="$HOME" bash -l -c 'your_command'
Пример:
$ 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
будет запущена оболочка входа .bash_login
или .bash_profile
. Чтобы получить чистую среду, используйте --noprofile
или установите HOME
каталог, в котором нет этих файлов. Я полагаю, это зависит от того, что вы подразумеваете под «чистым».
env -i bash -c ...
. Этот ответ специально для случаев, когда вам нужна оболочка, которая выглядит так, как будто вы только что сделали новый вход в систему на компьютере.
Чтобы ответить на комментарий Балки (и отвечая на мой собственный вопрос в процессе :-):
% 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
я получу следующее:/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.