通过将terminal添加到PATH中,从terminal运行命令或脚本,我在做什么错误?

在osx / linux上,我希望能够从任何链接到程序的任何地方在terminal上运行命令/脚本。

即我想能够运行:

合金

运行:

/usr/local/share/npm/lib/node_modules/alloy/bin/alloy

我猜添加到.bashrc是最好的方法? 我试过运行:

export PATH="$PATH:/usr/local/share/npm/lib/node_modules/alloy/bin"

并且:

 export PATH="$PATH:/usr/local/share/npm/lib/node_modules/alloy/bin/alloy" 

然后我开始了一个新的terminal窗口,但合金命令不起作用。 我错过了什么吗?

添加到PATH的最佳位置不是〜/ .bashrc文件,而是〜/ .bash_profile(如果存在)。 如果.bash_profile不存在,最好的地方是〜/ .profile。 〜部分自动扩展为您的主目录( /home/you )。

当您login并执行bash作为“loginshell”时,它会读取.bash_profile。 如果找不到,它会读取.profile。 在这种情况下, 不会读取.bashrc (除非从.bash_profile内部显式调用)。 我很less把任何东西放在.bashrc中; 如果你想使用一些,应该去那里的一件事是别名。

为了保持兼容一些旧的loginshell(如ksh88),也读取.profile,您可以另外使用一个单独的导出行:

 PATH="$PATH:/usr/local/share/npm/lib/node_modules/alloy/bin" export PATH 

您的语法对于.bash_profile是正确的:

 export PATH="$PATH:/usr/local/share/npm/lib/node_modules/alloy/bin" 

您可以立即testing它,只需在您的实际bash命令行中input上面的一个,然后尝试查看它是否被识别:

 echo "$PATH" which alloy alloy 

现在,作为你的.bash_profile或.profile的一个testing,login一个新的会话(不打开另一个terminal窗口,但真正使用你的login名和密码)。

要为所有系统用户启用相同的设置,请根据您的Linux风格更改/ etc / profile或/etc/profile.d。 这是一个系统级configuration文件,可以在〜/ .bash_profile或〜/ .profile之前的每个login名上读取。

一个不需要操纵path的简单解决scheme是简单地在/usr/local/bin/usr/local/sbin文件夹中创build应用程序的符号链接,因为这些文件夹已经在您的path中。 我经常使用这个程序来安装到/opt/usr/local或其他默认不在path中的地方。

 ln -s /usr/local/share/npm/lib/node_modules/alloy/bin/alloy /usr/local/bin/alloy 

当然,如果程序需要从某个工作目录运行,这可能并不总是有效的,如果一个程序有这样的要求,如果你改变了PATH也不行。 我偶尔会看到这个devise错误的脚本,假设他们是从某个特定的path调用的。