Ketika saya menggunakan ZSH, bagaimana cara mengatur PATH di /etc/profile.d?

22

Saya menggunakan zshshell saya, dan saya mencoba mengkonfigurasi lingkungan saya.

Saya biasanya mendefinisikan $JAVA_HOMEvariabel saya dengan membuat file:

/etc/profile.d/java.sh

dengan konten berikut

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

kemudian saya logout dan kembali, dan semuanya bekerja, tetapi karena suatu alasan PATHvariabel tidak disetel. Ia mengenali JAVA_HOME, tetapi bukan yang baru PATH, lihat cuplikan terminal ini:

~  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

dan saya mengkonfirmasi dengan mencoba menjalankan perintah dari jvm

~  java -version
zsh: command not found: java

yang PATHtidak termasuk $JAVA_HOMEsebagaimana mestinya. apakah ada hal lain yang harus saya periksa?

Saya telah memeriksa bahwa jika saya menjalankan:

source /etc/profile.d/java.sh

semuanya berjalan dengan benar dan variabel saya diatur sebagaimana mestinya, tetapi bukankah skrip harus /etc/profile.ddijalankan secara otomatis?

Rodrigo Sasaki
sumber
Sudahkah Anda mencoba mengedit ~/.profiledan menempatkan variabel di sana? Mungkin yang PATHsedang ditimpa di tempat lain di /etc/profile.d/.
saiarcot895

Jawaban:

27

Dari sudut pandang saya, cara terbaik adalah menambahkan baris berikut pada ~/.zshrcfile (jika Anda belum memilikinya, maka buatlah):

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

Kemudian restart Anda zsh, atau jalankan saja source ~/.zshrcdan kemudian PATH Anda harus persis seperti yang Anda inginkan.

Atau, jika Anda ingin membuat perubahan menjadi seluruh sistem, kemudian tambahkan kode sebelumnya ke akhir /etc/zsh/zshenvfile.

Tetapi bagaimanapun juga tidak digunakan /etc/profile.duntuk menjalankan skrip secara otomatis zsh. Direktori ini hanya berguna untuk bashshell, tidak zshseperti pada kasus Anda. Untuk memahami hal ini, buka /etc/profilefile, yang merupakan file inisialisasi bash dan sama sekali bukan file inisialisasi zsh , dan Anda akan melihat suatu tempat di akhir file:

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

Jadi, skrip Anda dari /etc/profile.ddirektori akan berjalan secara otomatis zshhanya jika Anda menambahkan kode sebelumnya dalam file inisialisasi zsh, seperti /etc/zsh/zprofilemisalnya, atau sumber /etc/profiledalam /etc/zsh/zprofilefile.

Radu Rădeanu
sumber
4
Mungkin ~/.zprofilelebih baik dari itu ~/.zshrc.
muru
3

Saya menemukan bahwa menempatkan semuanya dalam satu .zshenvfile dengan cepat menjadi sulit untuk dikelola. Saya sarankan menginstal oh-my-sh dan kemudian menempatkan berbagai penyesuaian (env vars, functions) ke .oh-my-sh/custom/direktori sebagai .zshfile terpisah .

Saya juga menemukan bahwa pendekatan ini bekerja dengan sempurna ketika ssh'ing ke mesin ketika memodifikasi variabel env seperti PATH. Juga berfungsi sangat baik bersama dengan vcsh untuk menjaga agar kustomisasi tetap didukung dan sinkron.

dvim
sumber
Menggunakan oh my zsh framework, di mana Anda akan meletakkan variabel dengan ip address (server jauh) untuk digunakan untuk akses ssh? Saya perlu ip untuk git dan skrip login ke server.
Timo
1
Hm Tidak yakin apa yang Anda maksud. Saya akan meletakkan konfigurasi seperti alamat ip dan nama pengguna untuk ssh to~/.ssh/config
dvim
Saya pribadi lebih suka pendekatan ini daripada jawaban yang diterima karena saya suka keuntungan menggunakan vcsh dan folder "custom" untuk ZSH adalah tempat yang ideal untuk hal-hal seperti ini.
Erick Brown
1

Sejak JAVA_HOMEdiatur, Anda telah mengkonfirmasi bahwa skrip tersebut bersumber secara otomatis, bukan?

Satu-satunya penjelasan logis adalah yang PATHdiatur nanti entah bagaimana. Seharusnya diatur oleh PAM yang berbunyi /etc/environment, dan sejauh yang saya tahu itu terjadi sebelum /etc/profile.d/*.shfile bersumber. Mungkin zsh bekerja berbeda dibandingkan dengan bash dalam hal itu.

Gunnar Hjalmarsson
sumber
0

Baru saja mengalami masalah ini secara lokal setelah menjalankan pembaruan. Sepertinya masalah root adalah Drush tidak tahu di mana menemukan salinan php yang sah yang menyertakan pdo. Untungnya itu mendukung menyimpan path ini dalam variabel lingkungan, jadi saya melakukan ini pada commandline:

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

Itu memperbaiki masalah jadi saya mengedit .zshrc dan menambahkannya ke file, masalah terpecahkan.

Allen Freeman
sumber
1
Jadi, Anda menyarankan agar .zshrcdigunakan, sama dengan jawaban teratas ?
muru