Làm thế nào để thêm đường dẫn thư mục chính được Unix phát hiện ra lệnh nào?


12

Tôi đã cài đặt node.jstại vị trí tùy chỉnh và thêm vị trí $PATHvào .profiletệp trong .

$ 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"

Bản thân Node.js chạy tốt. Vấn đề là nó không được liệt kê bởi whichlệnh. Vì vậy, tôi không thể cài đặt npmngay bây giờ. Bởi vì npmcài đặt không thể tìm thấy vị trí của node.js. Làm thế nào tôi có thể làm cho nodenhị phân được phát hiện bởi which?

Câu trả lời:


11

Điều này đang xảy ra vì ~chưa được mở rộng. Shell của bạn biết làm thế nào để đối phó với điều này, nhưng whichkhông (hầu hết các chương trình khác). Thay vào đó, hãy làm:

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

Ngoài ra, ngừng sử dụng whichvà sử dụng (hầu như luôn luôn vượt trội) type -p.

Dưới đây là một minh chứng về vấn đề:

$ 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

Hãy nhớ rằng một số chương trình khác nhìn vào $PATHcó thể không hiểu ý nghĩa của ~một trong hai, và coi nó là một phần của một con đường tương đối. Nó dễ sử dụng hơn $HOME.


1
Trong khi giải pháp đề xuất không hoạt động, giải thích là sai. whichkhông có lỗi ở đây; các ~lẽ ra phải được mở rộng trong định nghĩa của PATH. Có một điều kỳ lạ trong bash rằng ~dù sao nó cũng mở rộng ra PATH, vì vậy hai cái sai tạo thành một loại đúng.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Điều đó khác với những gì tôi nói như thế nào?
Chris Xuống

Thực tế là điều này hoạt động hoàn toàn với trích dẫn ~là một sự kỳ quặc. Có nghĩa đen ~trong đó $PATHcó khả năng gây rắc rối xuống dòng vì có những chương trình tự tách ra $PATHvà họ không đối xử ~đặc biệt.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles ... và nó khác với những gì tôi đã nói trong đoạn cuối của tôi như thế nào?
Chris Xuống

1
Mặc dù về mặt kỹ thuật, một số chương trình khác có thể không hiểu ý nghĩa của ~Lít, câu của bạn là sai. Trong bối cảnh $PATH, đây là mọi chương trình khác ngoài bash.
Gilles 'SO- ngừng trở nên xấu xa'

18

Dòng đó trong bạn .profilenên là một trong

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

~tự chỉ được mở rộng vào thư mục chính của bạn khi đó là ký tự đầu tiên của từ và nó không được trích dẫn. Trong những gì bạn đã viết, ~là giữa hai dấu ngoặc kép và do đó không được mở rộng. Ngay cả khi bạn đã viết export "PATH=$PATH:"~/Unix/homebrew/bin, ~nó sẽ không được mở rộng vì nó không ở đầu một từ vỏ.

Có một phân phối đặc biệt, nhằm mục đích viết các giá trị cho PATHvà các biến tương tự. Nếu ~chỉ sau dấu bằng đánh dấu một nhiệm vụ hoặc nếu ~chỉ sau một :bên phải của một nhiệm vụ, thì nó được mở rộng. Chỉ các bài tập đơn giản mới có phần phân phối này, export PATH=…không được tính (đó là một cuộc gọi đến exportnội dung, điều này xảy ra để có một đối số có chứa một =ký tự).

Tại đây, bạn không cần xuất PATHvì nó đã được xuất. Bạn không cần phải gọi exportkhi bạn thay đổi giá trị của một biến (ngoại trừ trong các vỏ Bourne cũ mà bạn sẽ không tìm thấy trên OSX hoặc Linux). Ngoài ra, trong một bài tập (một lần nữa, exportkhông được tính), bạn không cần dấu ngoặc kép quanh phía bên tay phải, vì vậy PATH=$PATH:~/Unix/homebrew/binvẫn an toàn ngay cả khi $PATHcó khoảng trắng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.