在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执行的确切内容是什么?
这个措辞很草率.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实例中执行的内容,这些内容能够持久化.