очистити всі змінні без закриття терміналу


10

Я хочу знати, як очистити всі змінні, які я визначив у командному рядку, не закриваючи термінал?

Наприклад, якщо я встановив змінну в командному рядку як:

$ a=1

тепер я хочу видалити змінну $a(та багато інших змінних, визначених аналогічно), не закриваючи термінал. Я міг би скористатися, unsetале це буде неспокійно, якщо великих немає. змінних


2
exec "$0"можливо - але важко сказати, що ти маєш на увазі під глобальним .
mikeserv

3
Чому ти хочеш це робити?
Hauke ​​Laging

1
@HaukeLaging Я працюю з масивами за допомогою скрипту. Я іноді додаю до нього один елемент. через що я не можу запустити скрипт зі старими значеннями (оскільки масив змінено). я повинен закрити термінал і почати новий сеанс знову. Сподіваюся, я зрозумів. якщо ні, будь ласка, повідомте мене :)
Едвард Торвальдс

1
@muru - він отримує список збережений до $varз а var=$(declare -p +F);потім передає його в якості аргументу функції , яка робить , echo "${2%%=*}".що відповідь має кілька проблем з величезними розмірами - але він повинен працювати , якщо середовище не настільки велика.
mikeserv

3
Я поняття не маю, що ти намагаєшся робити. Ви говорите про інтерактивну оболонку чи сценарій? Змінні, встановлені в сценарії, виконаному з інтерактивної оболонки, не впливають на батьківську оболонку. Розкажіть нам, чого ви хочете досягти, а не який тупик ви переслідуєте .
Жил "ТАК - перестань бути злим"

Відповіді:


10

Якщо ви (GNU coreutils)

exec env --ignore-environment /bin/bash

ви будете використовувати свіже та нове середовище


про що exec "$0"?
Едвард Торвальдс

@edwardtorvalds $0- це нульовий аргумент виконаної оболонки. Таким чином, якщо ви використовуєте bash $0це bash (ймовірно , - це могло б бути -bashв -lразі ogin оболонки в залежності від версії) . Якщо ви запускаєте скрипт із #!/bin/bashчубкою, $0це шлях до сценарію. exec "$0"ймовірно, більш гнучка, але exec bashбільш чітка. Якщо ви введете цю команду в терміналі, bashслід розпізнати її в інтерактивному середовищі і зробити еквівалент bash -i- що призведе до ~/.bashrcзапуску вашого файлу.
mikeserv

Це не допомагає export a=123, що змінна успадковується ...
стимул

1

Ви можете використовувати env, що надається GNU coreutils (як правило, попередньо встановлено в системах GNU / Linux):

exec env --ignore-environment /bin/bash

Виклик системи exec полягає в тому, що ваш поточний процес замінюється на місце новою, без оточуючої середовища версією вашої оболонки.

Це має перевагу також очистити будь-які експортовані змінні середовища.


Але це дозволить очистити мою змінену змінну PATH, наприклад export PATH=$PATH:~/foo, правда?
Едвард Торвальдс

Ти правий. Я змінив свою відповідь, щоб абсолютний шлях оболонки використовувався замість 0 доларів.
user30747

Завдяки user30747, вкрав вашу відповідь, щоб виправити мою. Неможливо видалити прийняту відповідь
Жилль Кінот
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.