什么是源shell函数?

时间:2016-10-20 22:34:52

标签: bash nvm

在nvm README.markdown中说

  

请注意which nvm无效,因为nvm是来源的shell   函数,不是可执行的二进制文件。

我发现nvm安装过程会使用

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

不知何故,这使得nvm命令可用于shell。我的问题是什么是"来源的shell函数"命令nvm执行的确切内容是什么?

1 个答案:

答案 0 :(得分:6)

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

至于具体语法:

. somefile

是更便携的写作方式

source somefile

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

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

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