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

qua*_*ote 78 linux bash shell command-line

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

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

function foo () { echo "bar" ; }
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*sen 106

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

unset -f foo
Run Code Online (Sandbox Code Playgroud)

bash联机帮助页中形成unset条目:

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

注意:-f只有存在同名变量时才真正需要。如果您还没有一个名为 的变量foounset foo则将删除该函数。

  • @XavierStuvw:`unset` 不是外部命令,它是 shell 的一部分(在本例中为 *bash*);尝试 `man bash` 并找到 [`unset`](https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#index-unset) 的条目(管理是相当大,“unset”在“Shell Builtin Commands”部分下)。 (2认同)
  • 从 bash 4.3.30 开始,即使没有变量命名为 foo,`-f` 也是必需的, (2认同)

Xav*_*uvw 6

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.
Run Code Online (Sandbox Code Playgroud)

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

  • 没有 `man unset` 因为它是一个 _built-in_ 命令,而对于 _built-in_ 命令,则是 `help`。对于某些 _built-in_ 命令,它也存在外部可执行文件。如有疑问,请尝试例如`type mycommnad`。例如`type unset`,它会回答你`unset is a shell builtin`。如果你想知道它是否存在可执行文件也尝试`which echo`(另一个内置),它会说它在哪里。`--option_long` 是典型的可执行命令。试试 `echo --help` 和 `/bin/echo --help`。`:-)`。 (5认同)