Có cách nào để thêm một thư mục vào PATH của tôi trong zsh chỉ khi nó chưa có mặt?


15

Có một cách dễ dàng trong zsh để thêm một thư mục vào PATH của tôi chỉ khi nó chưa có mặt? (hoặc, nói chung hơn, bất kỳ biến môi trường). Tôi đã thử:

PATH+=/my/directory

... nhưng nếu điều đó được thực hiện hai lần, nó sẽ được thêm hai lần.


2
@uther, đó không phải là một bản sao vì câu hỏi khác là dành cho bash, trong khi câu hỏi này dành cho zsh có cách riêng để giải quyết vấn đề này.
Stéphane Chazelas

Câu trả lời:


32

Trong zsh $PATHđược gắn (xem typeset -T) vào $pathmảng. Bạn có thể buộc mảng đó có các giá trị duy nhất với:

typeset -U path

Và sau đó, thêm đường dẫn với:

path+=(~/foo)

Không phải lo lắng nếu nó đã có.

Để thêm nó ở phía trước, làm:

path=(~/foo "$path[@]")

hoặc là:

path[1,0]=~/foo

nếu ~/foođã có trong $pathđó sẽ di chuyển nó ra phía trước.


Ý bạn là typeset -Ug pathsao? Khi tôi sử dụng typeset -U pathtrong ~/.zshrctệp của mình , tôi luôn gặp lỗi về không có gì trong đường dẫn trong khi zshrc đang chạy
kalbasit

@eMxyzptlk, lạ. -glà để tránh giới hạn phạm vi, nhưng trong ~/.zshrc, phạm vi là toàn cầu. Ngoài ra, tôi chưa bao giờ thấy zshphàn nàn về một sản phẩm nào $PATH(ngoại trừ lệnh không tìm thấy lỗi trong khóa học).
Stéphane Chazelas

3

Thêm export -U PATH=~/foo${PATH:+:$PATH}vào một trong các tập tin khởi động của bạn. Chỉ -Ugiữ lại lần xuất hiện đầu tiên của một giá trị trong mảng hoặc các :biến được phân tách nhất định như PATH.


-3

Bạn sẽ phải làm một cái gì đó như:

if echo $PATH | grep :newpath: ; then doIfPresent; else doIfMissing; fi

Điều này chỉ hoạt động nếu newpathđược phân định bu hai ':', cần xem xét các trường hợp khi nó ở đầu hoặc cuối tương tự.

Urgh.


1
Bạn có thể làm điều đó bên trong vỏ, chỉ với các tính năng Bourne / POSIX. Điều này tránh trích dẫn đau đầu (ít nhất là làm cho echo "$PATH": luôn luôn đặt dấu ngoặc kép xung quanh thay thế biến ). case ":$PATH:" in *:/new/directory:*) :;; *) PATH=$PATH:/new/directory;; esac
Gilles 'SO- ngừng trở nên xấu xa'
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.