Answers:
.profile
与 .zprofile
当Zsh 作为登录shell调用时,它运行~/.zprofile
,而不是运行~/.profile
。原因是zsh与标准shell有足够的不兼容性来破坏脚本。
~/.profile
如果Zsh 被称为as sh
或,则它会运行ksh
。但是,如果您的目标是在登录时得到zsh提示,那无济于事。
您可以制作/bin/sh
您的登录Shell并将其包含export SHELL=/bin/zsh
在中~/.profile
。然后,当您打开一个终端时,该终端将启动zsh(除了一些终端仿真器不遵守该$SHELL
设置之外)。但是sh
,通过ssh登录时,您仍然可以使用。可以通过exec zsh
在末尾添加~/.profile
(通过zsh替换正在运行的shell)进行补救,但是您只需要谨慎地进行交互式登录,而不需要在~/.profile
其他脚本(例如X会话开始)中添加它(一个好方法)。 test是通过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机器上,登录外壳是bash,但是您可以使用chsh
命令或通过其他工具(例如Ubuntu中的“用户设置”)进行更改。当它是登录外壳程序时,bash读取~/.bash_profile
是否存在和~/.profile
,而bsh读取~/.zprofile
(因为其语法与传统的sh并不完全兼容)。在大多数配置下,~/.profile
当您登录图形显示管理器时,X会话启动脚本也会加载该文件。
当您启动终端仿真器并得到一个shell提示时,或者当您显式启动一个shell时,您将获得一个不是登录shell的shell。由于~/.profile
(或~/.zprofile
)用于登录时要执行的命令,因此非登录外壳程序不会读取此文件。相反,当您启动交互式zsh时,它将显示为~/.zshrc
。(Zsh会读取~/.zshrc
所有交互式shell,无论它们是否为登录shell;奇怪的是,bash从未读取~/.bashrc
登录shell。)
通常,它~/.profile
包含环境变量定义,并且可能会在登录时或整个会话中启动一些您想运行一次的程序;~/.zshrc
包含每个shell实例必须完成的事情,例如别名和函数定义,shell选项设置,完成设置,提示设置,键绑定等。
~/.profile
zsh
登录时未加载。zsh
~/.zprofile
登录时加载。zsh
~/.zshrc
在开始新的终端会话时加载。需要更多信息?看看吉尔斯的绝妙答案!
除了Gilles的答案之外,对于相当新的zsh版本,您还可以执行以下操作:
[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'
...这将使用zsh的sh-mode来获取.profile文件。并且仅在源期间处于活动状态。因此,您不必保存当前选项状态即可在采购后再次播放它。
我.zprofile
兼容.profile
(仅包含PATH更改),因此只需要:
ln -s .profile .zprofile
该zsh的文档我手头上只提到/etc/profile
并~/.profile
在登录shell SH / KSH兼容模式。
% zsh --version
zsh 4.3.10 …
% cat ~/.profile
echo 'Running ~/.profile...'
纯模式登录外壳程序(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...