очистить все переменные, не закрывая терминал

10

Я хочу знать, как очистить все переменные, которые я определил в командной строке, не закрывая терминал?

например, если я установил переменную в командной строке как:

$ a=1

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

Эдвард Торвальдс
источник
2
exec "$0"возможно - но трудно сказать, что вы подразумеваете под глобальным .
mikeserv
3
Почему ты хочешь это сделать?
Хауке Лагинг
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/bashbangline, $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 позволяет заменить текущий процесс новой версией вашей оболочки без использования среды.

Это имеет преимущество также для очистки любых экспортируемых переменных среды.

user30747
источник
Но это очистило бы мою измененную переменную PATH, например export PATH=$PATH:~/foo, верно?
Эдвард Торвальдс
Вы правы. Я изменил свой ответ так, чтобы вместо $ 0 использовался абсолютный путь оболочки.
user30747
Благодаря user30747, украли ваш ответ, чтобы исправить мой. Не удалось удалить принятый ответ
Жиль Квено