#1 楼
.profile
与.zprofile
Zsh在作为登录shell调用时运行
~/.zprofile
,而不是~/.profile
。原因是zsh与标准shell有足够的不兼容性来破坏脚本。如果zsh被称为
~/.profile
或sh
,它将运行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
获得的父进程的名称:如果是sshd
或su
,那么对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选项设置,完成设置,提示设置,键绑定等。#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...
评论
好答案!我已经创建了〜/ .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