我刚刚在Ubuntu系统上安装了zsh。似乎zsh不在init上执行〜/ .profile。据我所知,这应该是自动行为。我想念什么?

#1 楼


.profile.zprofile


Zsh在作为登录shell调用时运行~/.zprofile,而不是~/.profile。原因是zsh与标准shell有足够的不兼容性来破坏脚本。

如果zsh被称为~/.profilesh,它将运行ksh。但是,如果您的目标是登录时得到zsh提示,那就没有帮助。

您可以将/bin/sh设置为登录shell,并在export SHELL=/bin/zsh中添加~/.profile。然后,当您打开一个终端时,该终端将启动zsh(除了少数终端仿真器不遵守$SHELL设置外)。但是,通过ssh登录时,您仍然会看到sh。可以通过在exec zsh的末尾添加~/.profile(用zsh替换正在运行的shell)来解决此问题,但是您只需要谨慎地为交互式登录执行此操作,而不是在其他脚本(例如X会话启动)中包含~/.profile时,请不要这样做。 (一个很好的测试是ps -o comm= $PPID获得的父进程的名称:如果是sshdsu,那么对exec来说是安全的。)

使用zsh和运行~/.profile的最简单解决方案是创建一个在运行时进入sh仿真模式的~/.zprofile

emulate sh
. ~/.profile
emulate zsh


如果您的zsh足够新(在Ubuntu上,我认为这很清楚),您可以简化为~/.profile


emulate sh -c '. ~/.profile' vs. .zprofile


登录外壳程序将加载文件.zshrc。登录外壳程序是您以文本模式(例如,在文本控制台上或通过ssh)登录时启动的第一个过程。默认情况下,在大多数Linux机器上,登录外壳是bash,但是您可以使用~/.profile命令或通过其他一些工具(例如Ubuntu中的“用户设置”)进行更改。当它是登录外壳程序时,bash会读取chsh(如果存在)和~/.bash_profile,而zsh仅读取~/.profile(因为其语法与传统的sh并不完全兼容)。在大多数配置下,登录图形显示管理器时,X会话启动脚本也会加载~/.zprofile

启动终端仿真器并获得shell提示时,或启动shell时明确地,您得到的不是登录Shell的Shell。由于~/.profile(或~/.profile)用于登录时要执行的命令,因此非登录外壳程序不会读取此文件。相反,当您启动交互式zsh时,它将显示~/.zprofile。 (Zsh会在所有交互式外壳程序中读取~/.zshrc,无论它们是否是登录外壳程序; bash都奇怪,从来没有在登录外壳程序中读取~/.zshrc。)

通常,~/.bashrc包含环境变量定义,并且可能启动某些程序您想在登录时或整个会话中运行一次; ~/.profile包含每个shell实例必须完成的事情,例如别名和函数定义,shell选项设置,完成设置,提示设置,键绑定等。

评论


好答案!我已经创建了〜/ .zprofile并按照您的建议放置了这一行,但是它似乎没有任何作用。也许我应该将其放在.zshrc中?

–shmichael
2010-09-13 12:21



@shmichael:鉴于您的反应,我可能没有按照您的意图解释您的问题。我添加到答案的第二部分是否有帮助?

–吉尔斯'所以-不再是邪恶的'
2010-09-13 18:11

是的,当场。因此,如果我理解正确,我会想要.zprofile上的PATH声明和.zshrc上的别名。

–shmichael
2010-09-15 15:19

@ user1419674感谢您的更正,但不要在帖子中添加更改日志。该站点具有内置的修订历史记录。

–吉尔斯'所以-不再是邪恶的'
2014年3月17日在8:28

@alper是的。您没有运行登录shell,无论该非登录shell是什么,都在告诉它运行命令zsh。如果您想阅读.zprofile,请告诉zsh这是一个登录shell:ssh -Y4t user @ IP zsh --login

–吉尔斯'所以-不再是邪恶的'
20年7月7日在21:55

#2 楼

急躁人士的简短答案:



登录时~/.profile未加载zsh

zsh登录时已加载~/.zprofile

开始新的终端会话时,zsh会加载~/.zshrc

需要更多信息?看看吉尔斯的绝妙答案!

评论


爱这个TLDR。

–hassan789
19/12/28在2:35

#3 楼

除了Gilles的答案外,对于相当新的zsh版本,您还可以执行以下操作:

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


...将使用zsh的sh-mode来获取.profile文件有效。并且仅在源期间处于活动状态。因此,您不必保存当前的选项状态即可在采购后重播它。

评论


我的〜/ .zprofile中有这个,但是由于某种原因,〜/ .profile中的语句在我的shell中不可用。 Ubuntu 15.04; zsh 5.0.7

–friederbluemle
2015年9月15日上午11:08

没有代码很难诊断。

–弗兰克·特贝克(Frank Terbeck)
16 Mar 27 '16 at 10:10

我只是再次尝试,看来现在正在工作。不知道它是否固定在某个时刻或发生了什么。现在,zsh版本是5.1.1。

–friederbluemle
16-3-28的3:41

#4 楼

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

ln -s .profile .zprofile


#5 楼

我手头的zsh文档只提到了sh / ksh兼容模式下的登录shell /etc/profile~/.profile

% 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...