Khi tôi sử dụng ZSH, làm cách nào để đặt PATH trong /etc/profile.d?


22

Tôi đang sử dụng zshlàm vỏ của mình và tôi đang cố gắng định cấu hình môi trường của mình.

Tôi thường xác định $JAVA_HOMEbiến của mình bằng cách tạo một tệp:

/etc/profile.d/java.sh

với nội dung sau

export JAVA_HOME=/path/to/jdk
export PATH=$JAVA_HOME/bin:$PATH

sau đó tôi đăng xuất và quay lại, và tất cả đều hoạt động, nhưng vì một số lý do, PATHbiến không được đặt. Nó nhận ra JAVA_HOME, nhưng không phải là cái mới PATH, xem đoạn trích thiết bị đầu cuối này:

~  echo $JAVA_HOME
/usr/lib/jvm/jdk1.8.0_05
~  echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

và tôi đã xác nhận nó bằng cách chạy một lệnh từ jvm

~  java -version
zsh: command not found: java

các PATHkhông bao gồm $JAVA_HOMEnhư nó phải. Có cái gì khác tôi nên kiểm tra?

Tôi đã kiểm tra xem nếu tôi chạy:

source /etc/profile.d/java.sh

tất cả đều chạy chính xác và các biến của tôi được đặt như bình thường, nhưng không nên /etc/profile.dchạy các tập lệnh tự động?


Bạn đã thử chỉnh sửa ~/.profilevà đặt các biến ở đó chưa? Nó có thể PATHđược ghi đè ở nơi khác /etc/profile.d/.
saiarcot895

Câu trả lời:


27

Theo quan điểm của tôi, cách tốt nhất là thêm các dòng sau vào ~/.zshrctệp (nếu bạn chưa có nó, thì hãy tạo nó):

if [ -d "/path/to/jdk" ] ; then
    export PATH="/path/to/jdk/bin:$PATH"
fi

Sau đó khởi động lại zsh, hoặc chỉ chạy source ~/.zshrcvà sau đó PATH của bạn sẽ chính xác như bạn muốn.

Hoặc, nếu bạn muốn thay đổi thành toàn hệ thống, hãy thêm mã trước đó vào cuối /etc/zsh/zshenvtệp.

Nhưng trong mọi trường hợp không sử dụng /etc/profile.dđể tự động chạy tập lệnh zsh. Thư mục này chỉ hữu ích cho bashshell, không phải zshtrong trường hợp của bạn. Để hiểu điều này, hãy mở /etc/profiletệp, là tệp khởi tạo bash và trong mọi trường hợp không phải là tệp khởi tạo zsh và bạn sẽ thấy một nơi nào đó ở cuối tệp:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

Vì vậy, tập lệnh của bạn từ /etc/profile.dthư mục sẽ tự động chạy zshchỉ khi bạn thêm mã trước đó vào tệp khởi tạo zsh, /etc/zsh/zprofileví dụ như hoặc nguồn /etc/profiletrong /etc/zsh/zprofiletệp.


4
Có lẽ ~/.zprofilecó thể tốt hơn ~/.zshrc.
muru

3

Tôi thấy rằng việc đặt mọi thứ trong một .zshenvtệp nhanh chóng trở nên khó quản lý. Tôi khuyên bạn nên cài đặt oh-my-sh và sau đó đặt các tùy chỉnh khác nhau (env vars, hàm) vào .oh-my-sh/custom/thư mục dưới dạng .zshcác tệp riêng biệt .

Tôi cũng phát hiện ra rằng phương pháp này hoạt động hoàn hảo khi ssh'ing vào máy khi sửa đổi các biến env như PATH. Ngoài ra, nó hoạt động thực sự tốt đẹp cùng với vcsh để giữ cho các tùy chỉnh được sao lưu và đồng bộ hóa.


Sử dụng oh my zsh framework, bạn sẽ đặt biến với địa chỉ ip (máy chủ từ xa) để sử dụng cho truy cập ssh ở đâu? Tôi cần ip cho git và tập lệnh đăng nhập vào máy chủ.
Timo

1
Hừm. Không hoàn toàn chắc chắn những gì bạn có ý nghĩa. Tôi sẽ đặt cấu hình như địa chỉ IP và tên người dùng cho ssh đến~/.ssh/config
dvim

Cá nhân tôi thích cách tiếp cận này với câu trả lời được chấp nhận vì tôi thích lợi thế của việc sử dụng vcsh và thư mục "tùy chỉnh" cho ZSH là một nơi lý tưởng cho những thứ như thế này.
Erick Brown

1

Kể từ khi JAVA_HOMEđược đặt, bạn đã xác nhận rằng các tập lệnh đó có nguồn gốc tự động, phải không?

Giải thích hợp lý duy nhất là PATHđược thiết lập sau này bằng cách nào đó. Nó nên được đặt ban đầu bởi PAM để đọc /etc/environmentvà theo như tôi biết điều đó xảy ra trước khi /etc/profile.d/*.shcác tệp có nguồn gốc. Có thể zsh hoạt động khác so với bash ở khía cạnh đó.


0

Chỉ cần chạy vào vấn đề này cục bộ sau khi chạy cập nhật. Có vẻ như vấn đề gốc là Drush không biết tìm bản sao hợp pháp của php bao gồm pdo. May mắn thay, nó hỗ trợ sắp xếp đường dẫn này trong một biến môi trường, vì vậy tôi đã thực hiện điều này trên dòng lệnh:

export DRUSH_PHP="/Applications/MAMP/bin/php/php5.4.39/bin/php"

Điều đó đã khắc phục sự cố vì vậy tôi đã chỉnh sửa .zshrc và thêm nó vào tệp, vấn đề đã được giải quyết.


1
Vì vậy, bạn đang đề xuất rằng .zshrcđược sử dụng, giống như câu trả lời hàng đầu ?
muru
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.