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


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 позволяет заменить текущий процесс новой версией вашей оболочки без использования среды.

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


Но это очистило бы мою измененную переменную PATH, например export PATH=$PATH:~/foo, верно?
Эдвард Торвальдс

Вы правы. Я изменил свой ответ так, чтобы вместо $ 0 использовался абсолютный путь оболочки.
user30747

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