清除所有变量而不关闭终端


10

我想知道如何清除我在命令提示符定义的所有变量而不关闭终端吗?

例如,如果我在命令提示符下将变量设置为:

$ a=1

现在,我想删除变量$a(以及许多其他以类似方式定义的变量)而不关闭终端。我可以使用,unset但是如果没有大的话,那将会很忙。变量


2
exec "$0"也许-但是很难告诉你全球意味着什么。
mikeserv 2014年

3
你为什么要这么做?
Hauke Laging 2014年

1
@HaukeLaging我正在使用脚本处理数组。有时我会添加一个元素。因此,我无法使用旧值运行脚本(因为更改了数组)。我必须关闭终端并再次开始新的会话。我希望我说清楚了。如果没有,请告诉我:)
爱德华·托瓦尔兹

1
@muru-他将列表保存到$varwith中,var=$(declare -p +F);然后将其作为参数传递给一个函数,该函数的echo "${2%%=*}".大小确实有一些问题-但如果您的环境不是很大,它应该可以工作。
mikeserv 2014年

3
我不知道你想做什么。您是在谈论交互式外壳程序还是脚本?从交互式外壳执行的脚本中设置的变量不会影响父外壳。告诉我们您想要实现的目标,而不是您追求的目标
吉尔斯(Gillles)“所以-别再作恶了”

Answers:


10

如果您愿意(GNU coreutils)

exec env --ignore-environment /bin/bash

您将使用全新的环境


exec "$0"呢?
爱德华·托瓦尔兹

@edwardtorvalds $0是已执行shell的第零个参数。所以,如果你正在运行bash $0bash (可能-这可能是-bash-login管壳取决于版本)。如果您正在运行带有#!/bin/bash破折号的脚本,则为脚本$0的路径。exec "$0"可能更灵活,但exec bash更明确。如果您在终端上输入该命令,则bash应该识别它是在交互式环境中,并执行-的等效操作bash -i-这也将使您的~/.bashrc文件运行。
mikeserv 2014年

这无济于事export a=123,该变量是继承的...
stimur

1

您可以使用envGNU coreutils(通常预先安装在GNU / Linux系统上)提供的,:

exec env --ignore-environment /bin/bash

exec系统调用是为了使您当前的进程被新的无环境Shell版本替换。

这样的好处是还清除了所有导出的环境变量。


但这会清除我修改过的PATH变量,例如export PATH=$PATH:~/foo,对吗?
爱德华·托瓦尔兹

你是对的。我已经修改了答案,以便使用外壳程序的绝对路径而不是$ 0。
user30747 '19

多亏了user30747,您的答案才被盗。无法删除接受的答案
Gilles Quenot
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.