Zsh没有命中〜/ .profile


142

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

Answers:


203

.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:获得的父进程的名称(如果是sshdsu,则可以安全地使用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选项设置,完成设置,提示设置,键绑定等。


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

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

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

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

68

急躁人士的简短答案:

  1. ~/.profilezsh登录时未加载。
  2. zsh~/.zprofile登录时加载。
  3. zsh~/.zshrc在开始新的终端会话时加载。

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


好答案。正是您所需要的。
Django Reinhardt

21

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

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

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


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

没有代码很难诊断。
Frank Terbeck

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


0

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...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.