什么是源shell函数?

use*_*927 6 bash nvm

在nvm README.markdown中它说

请注意,这which nvm将无法使用,因为它nvm是一个源shell函数,而不是可执行二进制文件.

我发现是NVM安装过程将更新.bashrc

[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
Run Code Online (Sandbox Code Playgroud)

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

Cha*_*ffy 7

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


至于具体的语法:

. somefile
Run Code Online (Sandbox Code Playgroud)

是一种更便携的写作方式

source somefile
Run Code Online (Sandbox Code Playgroud)

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

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


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

  • 获取脚本的效果*几乎*与手动将其中的每个命令键入交互式 shell 的效果相同。因此,如果您可以通过在命令行中键入函数来定义该函数,则可以通过获取包含其定义的脚本来定义该函数。 (2认同)