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选项设置,完成设置,提示设置,键绑定等。
~/.profilezsh登录时未加载。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...