【问题标题】:Explain this command: . ~/nvm/nvm.sh解释这个命令: . ~/nvm/nvm.sh
【发布时间】:2012-09-05 16:49:15
【问题描述】:

我绝不是 Linux 的新手,但我就是不明白为什么必须将 .在这个命令前面:

. ~/nvm/nvm.sh

对于那些知道的人来说,这是激活 nvm bash 脚本的方法(它允许在 NodeJS 世界中创建一个虚拟环境)。但是,如果一个人不把那个开始时间放在命令前面,那么事情就不会成功。据我所知,“。”表示当前目录。然而,如果我这样做:

cd ~/nvm
nvm.sh

或者这个

~/nvm/nvm.sh

它不会起作用。为什么?为什么一定要放“。”然后在运行此命令之前有一个空格。

【问题讨论】:

    标签: linux bash nvm


    【解决方案1】:
    . ~/nvm/nvm.sh
    

    它要求解释器在当前进程中解释脚本。在bash 中相当于:

    source ~/nvm/nvm.sh
    

    如果你想改变环境(变量等),你需要在当前进程中执行一个脚本。您可以通过help .查看更多详情


    ~/nvm/nvm.sh
    

    这个实际上是在一个新的 bash 进程中运行脚本。它不能改变父进程的环境,例如不能将变量导出到父进程。

    【讨论】:

    • 澄清 . 是 bash 中 source 的别名。
    • 它是!!!哇,这让一切都清楚了。非常感谢,我不知道我怎么会知道这一点。
    • 一个澄清 - 最后一个例子(没有.source)确实在一个新的bash(或其他)进程中运行脚本。然而,它可以并且确实改变环境,只是在一个子进程中,然后立即退出,所以改变会丢失。它不能改变父进程中的环境
    • @Orbling;严格来说(我很挑剔). 不是别名。 . 是一个内置函数,就像source 一样,它恰好执行与source 完全相同的代码。如果它是别名,则用户无法更改它。请参阅 Bash 源代码中的 builtins/source.def
    • @cdarke:非常正确,它只是以别名的方式起作用,一种快捷方式的助记符。
    【解决方案2】:

    . 表示在当前 shell 中运行,因此您已设置或在脚本中设置的环境变量是共享的。我敢打赌,为脚本启动一个新的 shell 会将其置于无法运行的环境中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多