什么是 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 实例中执行的,所以这些内容能够持久化。
在 nvm README.markdown 中说
Please note that
which nvm
will not work, sincenvm
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
.
至于具体语法:
. somefile
是比较便携的写法
source somefile
...在当前 shell 中执行 somefile
中的操作,而不是在单独的 shell 运行 作为子进程。
因此,获取脚本可以修改您当前的解释器——设置变量、更改其工作目录,以及,是的,定义别名和函数——以执行外部程序无法做到的方式。
澄清一下:如果您 运行 bash somefile
,那么 somefile
定义的任何函数仅在 bash
的特定副本的持续时间内存在——当它退出并返回提示,somefile
中定义的函数将不再可用。相比之下,当您 source somefile
时,因为 somefile
的内容是在您当前的 shell 实例中执行的,所以这些内容能够持久化。