如何取消设置或摆脱bash功能?


33

如果在bash中设置或导出环境变量,则可以取消设置它。如果在bash中设置别名,则可以取消别名。但是似乎没有失效

考虑一下这个(简单的)bash函数,例如,将其设置在.bash_aliases文件中并在外壳初始化时读取。

function foo () { echo "bar" ; }

如何从当前的shell中清除此函数定义?
(更改初始化文件或重新启动外壳程序不计在内。)


话虽这么说,unfunction这将是一个很好的命令名称:-)
Joey 2010年

@JohannesRössel:zsh拥有它。
克里斯·约翰森

嗯,的确如此。不过,我发现PowerShell处理所有这些问题的方式更加直观和一致:-)
Joey 2010年

Answers:


50

未设置的内置命令采用一个选项,-f以删除功能:

unset -f foo

bash手册页中形成未设置的条目:

如果指定了-f,则每个名称都引用一个shell函数,并且该函数定义将被删除。

注意:-f仅当存在具有相同名称的变量时才真正需要。如果还没有名为的变量foounset foo则将删除该函数。


那就是我所缺少的。我-fexport中找到了该参数,但未在unset中找到它。谢谢。
quack quixote 2010年

2
@XavierStuvw:unset不是外部命令,它是外壳程序的一部分(在本例中为bash);尝试man bash找到以下条目unset(该控件unset在该Shell Builtin Commands部分下非常大)。
克里斯·约翰森

4

help unset

unset: unset [-f] [-v] [-n] [name ...]

Unset values and attributes of shell variables and functions.

For each NAME, remove the corresponding variable or function.

Options:
  -f    treat each NAME as a shell function
  -v    treat each NAME as a shell variable
  -n    treat each NAME as a name reference and unset the variable itself
    rather than the variable it references

Without options, unset first tries to unset a variable, and if that fails,
tries to unset a function.

Some variables cannot be unset; also see `readonly'.

Exit Status:
Returns success unless an invalid option is given or a NAME is read-only.

既没有unset --help也不man unset不幸。


4
并不是man unset因为它是内置命令,而是内置命令help。对于某些内置命令,它也存在一个外部可执行文件。如有疑问,请尝试type mycommnad。例如type unset,它将回答您 unset is a shell builtin。如果您想知道可执行文件是否存在,也可以尝试which echo(另一个内置文件),它会说出它在哪里。的--option_long是典型的可执行命令。尝试echo --help/bin/echo --help:-)
Hastur

@Hastur随时通过编辑其尾巴将您的评论添加到答案中。如果审核员批准,您将获得2分。
XavierStuvw'3

1
...感谢Xavier的想法:对您而言,比完成答案还重要;我想您错过了这是一个内置命令,对于他们,您必须使用help而不是man。(不是真的,因为您可以在SHELL BUILTIN COMMANDSman bash一章中找到它们,或者直接在...中找到它们)。很高兴在bash外壳下,您只需提出要求,您就会收到内置命令列表。(尝试和太)。man BASH-BUILTINShelp:-)help helpman man
Hastur

1
@Hastur为了所有读者的利益,您可以很好地完成答案。然后,我们可以删除注释,以消除小字体的混乱情况。
XavierStuvw

0

我最近想完全卸载nvm并重新安装它,并摆脱它的任何环境。事实证明,摆脱它似乎并不是因为大部分nvm是通过大量的Shell函数实现的,这些函数通过.bash_profile.bashrc或在您第一次安装它时告诉您的那些源代码命令添加到您的shell中。

首先,由于困惑which nvm不清,没有返回任何nvm命令,而仍然发现了其他命令,我最终发现declare -F它是一堆shell函数。我不想只是杀死shell并启动一个新的shell(出于与此处不相关的原因),因此我用以下命令清除nvm了该shell中的函数:

for F in `declare -F | grep -e nvm | cut -f 3 -d\ `; do unset -f $F; done

某些变化可能会对出于某种原因想要执行类似操作且无法重新启动新Shell或不希望这样做的人有所帮助。

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.