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?
.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 ~/.profile
jika disebut sebagai sh
atau ksh
. Tetapi jika tujuan Anda adalah untuk mendapatkan prompt zsh saat Anda masuk, itu tidak membantu.
Anda dapat membuat /bin/sh
shell login Anda dan memasukkannya ke export SHELL=/bin/zsh
dalam ~/.profile
. Kemudian ketika Anda membuka terminal, terminal akan meluncurkan zsh (kecuali untuk beberapa emulator terminal tidak mematuhi $SHELL
pengaturan). Tetapi Anda masih memiliki sh
ketika Anda login lebih dari ssh. Ini dapat diatasi dengan memasukkan exec zsh
di akhir ~/.profile
(ini menggantikan shell yang berjalan dengan zsh), tetapi Anda harus berhati-hati hanya untuk melakukan itu untuk login interaktif dan tidak ketika ~/.profile
disertakan dari skrip lain seperti mulai sesi X (yang baik test adalah nama dari proses induk yang diperoleh dengan ps -o comm= $PPID
: jika itu sshd
atau su
, maka aman untuk exec
).
Solusi termudah untuk bekerja dengan zsh dan run ~/.profile
adalah membuat ~/.zprofile
yang 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 ~/.profile
dimuat 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 chsh
perintah, atau melalui beberapa alat lain seperti "Pengaturan Pengguna" di Ubuntu. Ketika itu adalah shell login, bash membaca ~/.bash_profile
jika ada dan ~/.profile
, sedangkan zsh hanya membaca ~/.zprofile
(karena sintaksnya tidak sepenuhnya kompatibel dengan sh tradisional). Di bawah sebagian besar konfigurasi, ~/.profile
juga 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 ~/.zshrc
di semua shell interaktif, apakah itu shell login tidak; bash, anehnya, tidak pernah membaca ~/.bashrc
di shell login.)
Biasanya, ~/.profile
berisi definisi variabel lingkungan, dan mungkin memulai beberapa program yang ingin Anda jalankan sekali ketika Anda masuk atau untuk seluruh sesi; ~/.zshrc
berisi hal-hal yang harus dilakukan untuk setiap instance shell, seperti definisi fungsi dan alias, pengaturan opsi shell, pengaturan penyelesaian, pengaturan prompt, binding kunci, dll.
Jawaban singkat untuk orang yang tidak sabar:
~/.profile
tidak dimuat olehzsh
saat login.zsh
memuat~/.zprofile
saat login.zsh
memuat~/.zshrc
saat memulai sesi terminal baru.Perlu info lebih lanjut? Lihatlah jawaban luar biasa Gilles!
sumber
Selain jawaban Gilles, dengan versi zsh yang cukup baru Anda dapat melakukan ini:
... 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.
sumber
Saya memiliki
.zprofile
kompatibilitas dengan.profile
(hanya berisi perubahan PATH), karenanya hanya perlu:sumber
The zsh dokumentasi saya ada di tangan hanya menyebutkan
/etc/profile
dan~/.profile
kerang masuk dalam sh / ksh modus kompatibilitas.Shell login mode asli (argv [0] dimulai dengan
-
) tidak digunakan~/.profile
(meskipun akan digunakan~/.zprofile
):(tidak ada output)
sh / ksh kompatibilitas kerang modus masuk menggunakan .profile:
sumber