Я хочу запустити програму в порожньому середовищі (тобто без встановлених envariables). Як це зробити в баші?
Я хочу запустити програму в порожньому середовищі (тобто без встановлених envariables). Як це зробити в баші?
Відповіді:
Це можна зробити за допомогою 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"
дає 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"
даєdeclare -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
уникнути пошуку / тощо / профілю та друзів, а --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"
Це дає вам голий, але функціональний баш (такий же, як ви отримаєте при вході в неінтерактивний режим). Наприклад, це встановлює мову, часовий пояс, 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.