如何添加要被Unix发现的主目录路径的哪个命令?


12

我已node.js在自定义位置安装并将该位置添加到$PATHin .profile文件中。

$ node --version
v0.6.2
$ which node
$ echo $PATH
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:~/Unix/homebrew/bin
$ cat ~/.profile
export  PATH="$PATH:~/Unix/homebrew/bin"

Node.js本身运行良好。问题是它没有按which命令列出。所以我npm现在不能安装。因为npminstall无法找到的位置node.js。如何使node二进制文件被发现which

Answers:


11

发生这种情况是因为~尚未扩展。您的外壳程序知道如何处理,但which不知道(大多数其他程序也不知道)。相反,请执行以下操作:

export "PATH+=:$HOME/Unix/homebrew/bin"

或者,停止使用which,并使用(几乎总是上级)type -p

这是问题的示范:

$ echo "$PATH"
/usr/local/bin:/usr/bin:/bin
$ export "PATH+=:~/git/yturl"
$ yturl
Usage: yturl id [itag ...]
$ which yturl
$ type -p yturl
/home/chris/git/yturl/yturl
$ export "PATH=/usr/local/bin:/usr/bin:/bin:$HOME/git/yturl"
$ which yturl
/home/chris/git/yturl/yturl

请记住,其他一些程序$PATH可能无法理解两者的含义,~因此会将其作为相对路径的一部分。使用起来更方便$HOME


1
虽然提出的解决方案确实有效,但解释是错误的。which这里没有错;在~应该在的定义得到扩展PATH。bash中有一个古怪的地方,~无论如何它都会扩展PATH,因此有两个错误会构成一种正确的感觉。
吉尔(Gilles)“所以,别再邪恶了”,

@Gilles那和我说的有什么不同?
克里斯·

这一点在引用中~都起作用的事实是一个怪癖。有了这样的文字~$PATH可能引起麻烦的路线,因为有做自己的分裂计划$PATH,他们没有把~特别。
吉尔斯(Gilles)'所以

@Gilles ...那与我在最后一段中所说的有什么不同?
克里斯·

1
从技术上讲“其他程序……可能不理解”的含义是正确的~,但您的句子具有误导性。在的情况下$PATH,这是除bash之外的所有程序。
吉尔(Gilles)'所以

18

你那条线.profile应该是

export  PATH="$PATH:$HOME/Unix/homebrew/bin"
PATH="$PATH:$HOME/Unix/homebrew/bin"
PATH=$PATH:$HOME/Unix/homebrew/bin
PATH=$PATH:~/Unix/homebrew/bin

~仅当单词的第一个字符且未加引号时,该字符才会扩展到您的主目录。在您所写的内容中,~介于双引号之间,因此没有扩展。即使您编写了export "PATH=$PATH:"~/Unix/homebrew/bin~也不会进行扩展,因为它不是在shell单词的开头。

有一种特殊的分配方式,旨在写入PATH和类似变量的值。如果~在标记作业的等号之后,或者在作业右侧的~a之后:,则将其扩展。仅普通分配具有这种分配方式,export PATH=…不计算在内(这是对export内建函数的调用,后者恰好具有包含=字符的自变量)。

在这里,您不需要导出,PATH因为它已经被导出。export更改变量的值时无需调用(在OSX或Linux上找不到的旧Bourne Shell中除外)。另外,在赋值中(再次,export不算在内),您不需要在右手边加上双引号,因此PATH=$PATH:~/Unix/homebrew/bin即使$PATH包含空格也很安全。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.