Thêm một mục mới vào biến PATH trong ZSH


188

Tôi đang sử dụng zsh và tôi đang cố gắng thêm một mục mới ( /home/david/pear/bin) vào PATHbiến nhưng tôi không biết làm thế nào.

Điều khiến tôi bối rối nhất là không có một tham chiếu nào đến một PATHbiến trong ~/.zshrctệp của tôi , mà là echo $PATHtrả về:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Vì vậy, một PATHbiến đang được đặt ở đâu đó.

Câu trả lời:


212

Tại đây, thêm dòng này vào .zshrc:

export PATH=/home/david/pear/bin:$PATH

EDIT : Điều này không hoạt động, nhưng câu trả lời của bạn dưới đây là tốt hơn, vì nó tận dụng giao diện có cấu trúc mà ZSH cung cấp cho các biến như $PATH. Cách tiếp cận này là tiêu chuẩn cho bash, nhưng theo tôi biết, không có lý do gì để sử dụng nó khi ZSH cung cấp các lựa chọn thay thế tốt hơn.


29
haha quên nó đi, tôi mặc dù đó chỉ là một lệnh console nhưng việc thêm dòng đó vào .zshrc đã làm được điều đó. Cảm ơn rất nhiều!
David Barreto

1
.Sshshrc của tôi đã có một dòng để xuất PATH nên tôi đã thay thế nó bằng dòng đã sửa đổi.
Zack Huston

6
Tôi đã phải loại bỏ các trích dẫn kép xung quanh các mục tức là PATH="/home/david/pear/bin:/usr/bin:etc"để PATH=/home/david/pear/bin:/usr/bin:etcnó ở lại zshrc.
a7omiton 7/2/2015

3
@taco, bạn có thể sử dụng $ HOME
mencargo

1
@DanielSpringer: Vâng. Khi bạn mở một trình bao, nó thừa hưởng PATHtừ tiến trình cha đã khởi động nó và sau đó khi nó chạy .zshrc( .bashrchoặc bất cứ thứ gì), đó là những gì cho phép bạn thêm những thứ bổ sung vào đường dẫn đó.
Linuxios

223

Trên thực tế, sử dụng ZSH cho phép bạn sử dụng ánh xạ đặc biệt của các biến môi trường. Vì vậy, bạn có thể chỉ cần làm:

# append
path+=('/home/david/pear/bin')
# or prepend
path=('/home/david/pear/bin' $path)
# export to sub-processes (make it inherited by child processes)
export PATH

Đối với tôi đó là một tính năng rất gọn gàng có thể được truyền tới các biến khác. Thí dụ:

typeset -T LD_LIBRARY_PATH ld_library_path :

16
Câu trả lời tốt đẹp. Trong trường hợp của tôi, ~/.zshrccó nguồn gốc sau .profile, và ghi đè lên tất cả mọi thứ trong .profile. Mất một lúc kéo tóc tôi ra.
Khánh Nguyễn

1
Trường hợp chắp thêm không cần parens trừ khi bạn nối thêm nhiều phần tử. Nó cũng thường không cần báo giá. Vì vậy, cách đơn giản, ngắn để nối là
Micah Elliott

1
@SuperUberDuper, bạn nên hiểu rằng hầu như mọi shell unix chỉ đơn giản là đọc các tệp khởi động gần giống như khi bạn nhập nó vào shell một cách tương tác. Về các tập tin "RC", bạn có thể tìm thấy câu trả lời thú vị cho câu hỏi này
ony

6
Có thể tránh xuất khẩu rõ ràng với -xvà chỉ để lại các giá trị duy nhất trong một biến với -U, dấu hai chấm được mặc định, vì vậy nó có thể là:typeset -TUx PATH path
Nỗi buồn

2
@DanielSpringer, không. Nếu bạn muốn nó trong các điều khoản đó thì: path=(...)(không cần tham khảo $pathhoặc $PATHbên trong) gán, trả trước path=(... $path)path+(...)nối thêm.
ony

40

Bạn có thể nối vào của bạn PATHmột cách tối thiểu. Không cần dấu ngoặc trừ khi bạn nối thêm nhiều phần tử. Nó cũng thường không cần báo giá. Vì vậy, cách đơn giản, ngắn để nối là:

path+=/some/new/bin/dir

Sử dụng phổ biến

Sau đó, mẫu chung để kiểm tra tập lệnh mới / tệp thực thi sẽ trở thành:

path+=$PWD/.
# or
path+=$PWD/bin

Cú pháp chữ thường này đang sử dụng pathnhư một mảng , nhưng cũng ảnh hưởng đến tương đương đối tác chữ hoa của nó, PATH(mà nó được "ràng buộc" thông qua typeset).

(Lưu ý rằng không :cần thiết / muốn làm dấu phân cách .)

Các mẩu tin liên quan

Xử lý paththeo cách này (như một mảng) cũng có nghĩa là: không cần phải làm a rehash để có được các lệnh mới được tìm thấy.

Ngoài ra hãy xem vared pathnhư một cách năng động để chỉnh sửapath và những thứ khác.

Bạn có thể chỉ quan tâm đến pathcâu hỏi này, nhưng vì chúng ta đang nói về xuất khẩu và mảng, lưu ý rằng các mảng thường không thể được xuất.

Bạn thậm chí có thể ngăn không PATHtham gia vào các mục trùng lặp (tham khảo cái nàycái này ):

typeset -U path

Nó không phải là 'path + =: / foo / bar'? (có dấu hai chấm)
andrew lorien

1
@andrewlorien Mình cập nhật câu trả lời với chi tiết về dấu phân cách.
Micah Elliott

Lưu ý rằng nếu có một nhận xét sau đường dẫn, thì chúng ta cần trích dẫn, như thế nào path+='my/path' # for fun. Rõ ràng nếu bạn có không gian, nhưng không quá nhiều nếu bạn có ý kiến.
Franklin Yu

"(Lưu ý rằng không: là cần thiết / muốn như một dấu phân cách.)" Điều này chỉ đúng với chữ thường path. Cần có một phần trước :cho PATH, như sau trong .zshrc PATH+=:/Users/path/to/my/folder
Emmett R.

37

một lớp lót, không cần mở ~/.zshrctập tin

echo -n 'export PATH=~/bin:$PATH' >> ~/.zshrc

hoặc là

echo -n 'export PATH=$HOME/bin:$PATH' >> ~/.zshrc

Để xem hiệu ứng, hãy thực hiện source ~/.zshrctrong cùng một tab hoặc mở một tab mới


1
Hoạt động hoàn hảo trên OSX với vỏ Zsh.
Stryker

1
Làm việc như người ở!
Akbar Sha Ebrahim

14
  1. Đã thêm đường dẫn đến ~ / .zshrc

    sudo vi ~/.zshrc

    thêm đường dẫn mới

    export PATH="$PATH:[NEW_DIRECTORY]/bin"
  2. Cập nhật ~ / .zshrc

    Lưu ~ / .zshrc

    source ~/.zshrc

  3. Kiểm tra PATH

    echo $PATH


2
Đây là Bashcách.
CousinCocaine

13

TÙY CHỌN 1: Thêm dòng này vào ~ / .zshrc:

export "PATH=$HOME/pear/bin:$PATH"

Sau đó, bạn cần chạy source ~/.zshrcđể thay đổi ảnh hưởng HOẶC đóng cửa sổ này và mở một cửa sổ mới

TÙY CHỌN 2: thực hiện nó trong bảng điều khiển thiết bị đầu cuối để chỉ thêm đường dẫn này vào phiên cửa sổ thiết bị đầu cuối hiện tại. Khi bạn đóng cửa sổ / phiên, nó sẽ bị mất.


Bạn có thể giải thích làm thế nào câu trả lời này khác với cùng một câu trả lời được đăng 5 năm trước ?
Franklin Yu

trong câu trả lời này, người ta không nói rằng bạn phải thêm dòng mã này vào tệp, nếu bạn chỉ chạy như vậy thì nó sẽ chỉ thay đổi trong các cửa sổ hiện tại và điều này không được giải thích trong câu trả lời ban đầu
Dimitar
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.