Zsh tidak memukul ~ /. Profil

145

Saya baru saja menginstal zsh di sistem Ubuntu saya. Tampaknya zsh tidak menjalankan ~ / .profile di init. Untuk pemahaman terbaik saya, ini harus menjadi perilaku otomatis. Apa yang saya lewatkan?

shmichael
sumber

Jawaban:

204

.profile vs. .zprofile

Zsh berjalan ~/.zprofile, tidak ~/.profile, ketika dipanggil sebagai shell login. Alasannya adalah bahwa zsh memiliki cukup banyak ketidakcocokan dengan shell standar untuk memecah skrip.

Zsh tidak berjalan ~/.profilejika disebut sebagai shatau ksh. Tetapi jika tujuan Anda adalah untuk mendapatkan prompt zsh saat Anda masuk, itu tidak membantu.

Anda dapat membuat /bin/shshell login Anda dan memasukkannya ke export SHELL=/bin/zshdalam ~/.profile. Kemudian ketika Anda membuka terminal, terminal akan meluncurkan zsh (kecuali untuk beberapa emulator terminal tidak mematuhi $SHELLpengaturan). Tetapi Anda masih memiliki shketika Anda login lebih dari ssh. Ini dapat diatasi dengan memasukkan exec zshdi akhir ~/.profile(ini menggantikan shell yang berjalan dengan zsh), tetapi Anda harus berhati-hati hanya untuk melakukan itu untuk login interaktif dan tidak ketika ~/.profiledisertakan dari skrip lain seperti mulai sesi X (yang baik test adalah nama dari proses induk yang diperoleh dengan ps -o comm= $PPID: jika itu sshdatau su, maka aman untuk exec).

Solusi termudah untuk bekerja dengan zsh dan run ~/.profileadalah membuat ~/.zprofileyang memasuki mode emulasi sh saat dijalankan ~/.profile:

emulate sh
. ~/.profile
emulate zsh

Jika Anda memiliki zsh yang cukup baru (di Ubuntu, itu berarti sejak jelas, saya pikir), Anda dapat menyederhanakan ini menjadi emulate sh -c '. ~/.profile'.

.zprofile vs. .zshrc

File ~/.profiledimuat oleh shell login . Shell login adalah proses pertama yang dimulai ketika Anda masuk dalam mode teks, misalnya pada konsol teks atau melalui ssh. Secara default, pada sebagian besar mesin Linux, shell login adalah bash, tetapi Anda dapat mengubahnya dengan chshperintah, atau melalui beberapa alat lain seperti "Pengaturan Pengguna" di Ubuntu. Ketika itu adalah shell login, bash membaca ~/.bash_profilejika ada dan ~/.profile, sedangkan zsh hanya membaca ~/.zprofile(karena sintaksnya tidak sepenuhnya kompatibel dengan sh tradisional). Di bawah sebagian besar konfigurasi, ~/.profilejuga dimuat oleh skrip startup sesi X ketika Anda masuk di manajer tampilan grafis.

Ketika Anda memulai emulator terminal dan mendapatkan prompt shell, atau ketika Anda memulai shell secara eksplisit, Anda mendapatkan shell yang bukan shell login. Karena ~/.profile(atau ~/.zprofile) adalah untuk perintah yang ingin Anda jalankan ketika Anda masuk, shell non-login tidak membaca file ini. Sebaliknya, ketika Anda memulai zsh interaktif, bunyinya ~/.zshrc. (Zsh membaca ~/.zshrcdi semua shell interaktif, apakah itu shell login tidak; bash, anehnya, tidak pernah membaca ~/.bashrcdi shell login.)

Biasanya, ~/.profileberisi definisi variabel lingkungan, dan mungkin memulai beberapa program yang ingin Anda jalankan sekali ketika Anda masuk atau untuk seluruh sesi; ~/.zshrcberisi hal-hal yang harus dilakukan untuk setiap instance shell, seperti definisi fungsi dan alias, pengaturan opsi shell, pengaturan penyelesaian, pengaturan prompt, binding kunci, dll.

Gilles
sumber
Jawaban bagus! Saya telah membuat ~ / .zprofile dan meletakkan garis seperti yang Anda sarankan, tetapi sepertinya tidak melakukan apa-apa. Mungkin saya harus memasukkannya ke dalam .zshrc?
shmichael
1
@shmichael: Mengingat reaksi Anda, saya mungkin tidak menafsirkan pertanyaan Anda seperti yang Anda inginkan. Apakah bagian kedua yang saya tambahkan ke jawaban saya membantu?
Gilles
ya, langsung saja. Jadi jika saya mengerti dengan benar, saya ingin mis. Deklarasi PATH pada .zprofile dan alias pada .zshrc.
shmichael
@ user1419674 Terima kasih atas koreksi, tetapi jangan menambahkan log perubahan ke posting. Situs ini memiliki riwayat revisi bawaan.
Gilles
69

Jawaban singkat untuk orang yang tidak sabar:

  1. ~/.profiletidak dimuat oleh zshsaat login.
  2. zshmemuat ~/.zprofilesaat login.
  3. zshmemuat ~/.zshrcsaat memulai sesi terminal baru.

Perlu info lebih lanjut? Lihatlah jawaban luar biasa Gilles!

Karl Morrison
sumber
Jawaban yang bagus Apa yang Anda butuhkan.
Django Reinhardt
21

Selain jawaban Gilles, dengan versi zsh yang cukup baru Anda dapat melakukan ini:

[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'

... Yang mana akan sumber file .profile dengan sh-mode zsh berlaku. Dan itu hanya aktif selama sumber. Jadi Anda tidak perlu menyimpan status opsi saat ini untuk mengulangnya lagi setelah sumber.

Frank Terbeck
sumber
Saya memiliki ini di profil ~ / .zprofile saya, tetapi untuk beberapa alasan pernyataan di ~ / .profile tidak tersedia di shell saya. Ubuntu 15.04; zsh
5.0.7
Sulit didiagnosis tanpa kode.
Frank Terbeck
Saya baru saja mencoba lagi, dan sepertinya berfungsi sekarang. Tidak yakin apakah itu diperbaiki pada titik tertentu atau apa yang terjadi. Versi zsh adalah 5.1.1 sekarang.
friederbluemle
5

Saya memiliki .zprofilekompatibilitas dengan .profile(hanya berisi perubahan PATH), karenanya hanya perlu:

ln -s .profile .zprofile
Igor Shubovych
sumber
0

The zsh dokumentasi saya ada di tangan hanya menyebutkan /etc/profiledan ~/.profilekerang masuk dalam sh / ksh modus kompatibilitas.

% zsh --version
zsh 4.3.10 
% cat ~/.profile
echo 'Running ~/.profile...'

Shell login mode asli (argv [0] dimulai dengan -) tidak digunakan ~/.profile(meskipun akan digunakan ~/.zprofile):

% zsh -c 'exec -a -zsh zsh' </dev/null

(tidak ada output)

sh / ksh kompatibilitas kerang modus masuk menggunakan .profile:

% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...
Chris Johnsen
sumber