Я хочу запустить программу в пустой среде (то есть без установленных переменных). Как это сделать в 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.