什么是 sourced shell 函数?

What is a sourced shell function?

在 nvm README.markdown 中说

Please note that which nvm will not work, since nvm is a sourced shell function, not an executable binary.

我发现 nvm 安装过程会将 .bashrc 更新为

[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm

这使得 nvm 命令可用于 shell。我的问题是什么是 "sourced shell function" 以及命令 nvm 究竟执行什么?

这个措辞草率。 nvm 只是一个 shell 函数,通过获取定义该函数的文件来定义。这不会以任何定性方式改变函数:如果您手动输入它,它将是相同的函数,具有所有相同的行为,因此将 "sourced" 用作修饰符有点误导;更准确地说 nvm.sh 是一个源脚本,它定义了一个名为 nvm.

的 shell 函数

至于具体语法:

. somefile

是比较便携的写法

source somefile

...在当前 shell 中执行 somefile 中的操作,而不是在单独的 shell 运行 作为子进程。

因此,获取脚本可以修改您当前的解释器——设置变量、更改其工作目录,以及,是的,定义别名和函数——以执行外部程序无法做到的方式。


澄清一下:如果您 运行 bash somefile,那么 somefile 定义的任何函数仅在 bash 的特定副本的持续时间内存在——当它退出并返回提示,somefile 中定义的函数将不再可用。相比之下,当您 source somefile 时,因为 somefile 的内容是在您当前的 shell 实例中执行的,所以这些内容能够持久化。