Я хочу запустити програму в порожньому середовищі (тобто без встановлених 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.