題 Zsh沒有擊中〜/ .profile


我剛剛在我的Ubuntu系統上安裝了zsh。似乎zsh沒有在init上執行〜/ .profile。據我所知,這應該是一種自動行為。我錯過了什麼?


107
2017-09-12 07:20


起源




答案:


.profile 與 .zprofile

Zsh跑 ~/.zprofile不是 ~/.profile,當它被作為登錄shell調用時。原因是zsh與標準shell有足夠的不兼容性來破壞腳本。

Zsh確實在運行 ~/.profile 如果它被稱為 sh 要么 ksh。但是如果您的目標是在登錄時獲得zsh提示,那就沒有用了。

你(們)能做到 /bin/sh 你的登錄shell和include export SHELL=/bin/zsh 在你的 ~/.profile。然後當你打開一個終端時,終端會啟動zsh(除了少數終端仿真器不服從 $SHELL 設置)。但你仍然會有 sh 當您通過ssh登錄時。這可以通過包括來彌補 exec zsh 在......的最後 ~/.profile (這將用zsh替換正在運行的shell),但是你需要注意只為交互式登錄而不是在何時進行 ~/.profile 包含在其他腳本中,例如X會話開始(一個好的測試是獲得的父進程的名稱 ps -o comm= $PPID: 如果它是 sshd 要么 su那麼它是安全的 exec)。

使用zsh和run的最簡單的解決方案 ~/.profile 是創造一個 ~/.zprofile 在運行時進入sh仿真模式 ~/.profile

emulate sh
. ~/.profile
emulate zsh

如果你有一個最近足夠的zsh(在Ubuntu上,這意味著從清醒,我認為),你可以簡化為 emulate sh -c '. ~/.profile'

.zprofile 與 .zshrc

文件 ~/.profile 被加載 登錄 砲彈。登錄shell是在文本模式下登錄時啟動的第一個進程,例如在文本控制台上或通過ssh登錄。默認情況下,在大多數Linux機器上,登錄shell是bash,但您可以使用 chsh 命令,或通過其他工具,如Ubuntu中的“用戶設置”。當它是一個登錄shell時,bash讀取 ~/.bash_profile 如果它存在和 ~/.profile,而zsh只讀 ~/.zprofile (因為它的語法與傳統的sh不完全兼容)。在大多數配置下, ~/.profile 當您在圖形顯示管理器中登錄時,X會話啟動腳本也會加載。

當您啟動終端模擬器並獲得shell提示符時,或者當您顯式啟動shell時,您將獲得一個不是登錄shell的shell。以來 ~/.profile (要么 ~/.zprofile)對於您在登錄時要執行的命令,非登錄shell不讀取此文件。相反,當您啟動交互式zsh時,它會讀取 ~/.zshrc。 (Zsh讀 ~/.zshrc 在所有交互式shell中,它們是否是登錄shell都沒有; bash,奇怪的是,從不讀書 ~/.bashrc 在登錄shell中。)

通常情況下, ~/.profile 包含環境變量定義,並且可能會在您登錄或整個會話時啟動一些要運行的程序; ~/.zshrc 包含必須為每個shell實例執行的操作,例如別名和函數定義,shell選項設置,完成設置,提示設置,鍵綁定等。


155
2017-09-12 10:37



很棒的答案!我已經創建了〜/ .zprofile並按照你的建議放了一行,但它似乎沒有做任何事情。也許我應該把它放在.zshrc中? - shmichael
@shmichael:鑑於你的反應,我可能沒有按照你的意圖解釋你的問題。我在答案中添加的第二部分是否有幫助? - Gilles
是的,打到了現場。所以,如果我理解正確,我會想要,例如.zprofile上的PATH聲明和.zshrc上的別名。 - shmichael
@ user1419674感謝您的更正,但不要在帖子中添加更改日誌。該站點具有內置的修訂歷史記錄。 - Gilles


不耐煩的人的簡短回答:

  1. ~/.profile 沒有加載 zsh 登錄時
  2. zsh 負載 ~/.zprofile 登錄時
  3. zsh 負載 ~/.zshrc 在開始新的終端會話時。

需要更多信息?看看吉爾斯的精湛答案吧!


42
2018-03-21 13:38



+2表示快速,可掃描的答案 - dreftymac


除了Gilles的回答,使用zsh的最新版本你可以這樣做:

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

...將使用zsh的sh模式生成.profile文件。它只在源頭活動。因此,您無需保存當前選項狀態,以便在採購後再次重播。


16
2018-03-09 22:20



我在〜/ .zprofile中有這個,但由於某種原因,〜/ .profile中的語句在我的shell中不可用。 Ubuntu 15.04; zsh 5.0.7 - friederbluemle
沒有代碼很難診斷。 - Frank Terbeck
我剛試了一遍,看起來它現在正在工作。不確定它是否在某個時刻被修復或發生了什麼。 zsh版本現在是5.1.1。 - friederbluemle


我有 .zprofile 兼容 .profile (僅包含PATH更改),因此只需要:

ln -s .profile .zprofile

4
2018-04-14 15:30





zsh的 我手邊的文檔只提到 /etc/profile 和 ~/.profile 用於登錄shell SH/KSH 兼容模式。

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

本機模式登錄shell(argv [0]以。開頭 -)不使用 ~/.profile (它將使用 ~/.zprofile 雖然):

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

(沒有輸出)

SH/KSH 兼容模式登錄shell使用.profile:

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

0
2017-09-12 09:20