Як запустити програму в чистому середовищі в bash?


Відповіді:


127

Це можна зробити за допомогою env:

env -i your_command

В відміну від коментарів нижче, це робить абсолютно ясно з навколишнього середовища, але це не заважає your_commandвстановити нові змінні. Зокрема, запуск оболонки спричинить /etc/profileзапуск, і в оболонці можуть бути також деякі вбудовані настройки.

Ви можете перевірити це за допомогою:

env -i env

тобто витріть середовище, а потім надрукуйте його. Вихід буде порожнім.


4
Це не повністю очищає довкілля: 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.
l0b0

2
Тим НЕ менше, здається , що це ближче ви можете отримати - Схоже , що змінні , як PATH, PWDі SHLVLвстановлюються автоматично при допомозі Bash. +1.
l0b0

3
@ I0b0: Перегляньте мою редакцію.
АМС

3
Змінна PATH в сценарії першого коментатора не знаходиться в середовищі і тому не є змінною середовища. Bash, очевидно, встановлює свою власну звичайну змінну оболонки під назвою PATH, якщо для неї не експортується одна: 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:."
Бінарний Філі

34

"Чисте" bashсередовище може бути з цим

$ env -i bash --noprofile --norc
  • env -iКоманда виконує команду до нього в командному рядку без передачі будь - якої з експортованих змінних оточення старої середовища оболонки в навколишнє середовище виконуваної програми.

  • Цей --noprofileпараметр зупиняється на bashчитанні загальносистемних або персональних скриптів ініціалізації оболонок, які в іншому випадку будуть прочитані для оболонки входу.

  • Цей --norcпараметр зупиняється на bashчитанні персональних скриптів ініціалізації оболонок, які в іншому випадку читалися б для інтерактивної оболонки.


Моя середовище не розпізнає ці варіанти.
Пауло Карвальо

@PauloCarvalho Ваша система не підтримує env -i? На якій системі ви працюєте?
Kusalananda

Вибачте, він працює в оболонці. Я намагався вкласти це в сценарій і якось це кинуло помилку.
Пауло Карвальо

@PauloCarvalho Вибачте, я не можу побачити, яку команду ви ввели чи яку помилку отримали.
Кусалаланда

Чудово - просто те, що я шукав. envщоб очистити моє середовище та --noprofileуникнути пошуку / тощо / профілю та друзів, а --norcтакож уникнути пошуку ~ / .bashrc та друзів.
Феліпе Альварес

28

env -i somecommandвиконує команду в порожньому середовищі, як ams вже згадував .

Дуже багато програм покладаються на деякі важливі змінні середовища, тому ви можете зберегти їх:

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

Крім того, ви можете увійти в невелике середовище для входу.

ssh localhost somecommand

1
Працює під час виконання команди на cmdline. Як мені це вкласти в шебанг ?, схоже, не працює !
balki

Як не дивно, мій envне підтримує --розмежування і роблю env -i FOO=bar -- envспроби запустити команду з назвою --.
antak

@antak Це повинно бути env -i -- FOO=bar envнасправді. Моє ліжко. Не те, що --корисне, оскільки те, що випливає з нього, не починається -.
Жиль

Не розумів, що ти завжди можеш натрапити на localhost, це начебто дивно. Який там корисний випадок.
Edgar Aroutiounian

@EdgarAroutiounian Ви можете SSH в localhost, якщо він працює з SSH-сервером. Чому програмісти намагаються заборонити це?
Жиль

4

Хоча прийнята відповідь правильна, зазвичай ви хочете зробити це:

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

Це дає вам голий, але функціональний баш (такий же, як ви отримаєте при вході в неінтерактивний режим). Наприклад, це встановлює мову, часовий пояс, HOME тощо.


Це не зовсім спрацьовує, оскільки env -iочищає HOME, а значить, bash -lне може знайти ваші .bash_profileі т. Д. Якщо ви хочете, щоб оболонка була подібна до того, що ви отримали б у новому вході, вам потрібен додатковий непрямий спосіб HOME.
Забій Елліотта

Дивіться цю відповідь: unix.stackexchange.com/a/451389/157340
Забій Елліотта

1

Проблема з більшістю відповідей тут полягає в тому, що 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

1
Зауважте, що bashоболонка для входу буде запущена .bash_loginабо .bash_profile. Щоб отримати чисте середовище, використовуйте --noprofileабо встановіть HOMEкаталог, у якому немає цих файлів. Я думаю, це залежить від того, що ви маєте на увазі під «чистим».
Kusalananda

1
Так, якщо ви хочете, щоб оболонка, в якій буквально нічого немає, просто дотримуйтесь оригінальної відповіді та робіть env -i bash -c .... Ця відповідь конкретно, коли ви хочете, щоб оболонка виглядала так, як ви щойно зробили новий вхід на машині.
Забій Елліотта

0

Щоб відповісти на коментар балки (і відповісти на моє власне запитання в процесі :-):

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

Коли я спробую це в моєму рядку shebang в CentOS 7.6, я отримую цю помилку від env:/usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
ScottJ

Якщо я зміню сценарій, щоб використати довгий аргумент, --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.
ScottJ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.