Zsh 没有命中 ~/.profile

Zsh 没有命中 ~/.profile

我刚刚在 Ubuntu 系统上安装了 zsh。似乎 zsh 在初始化时没有执行 ~/.profile。据我所知,这应该是一种自动行为。我遗漏了什么?

答案1

.profile对阵.zprofile

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

如果以或~/.profile形式调用,Zsh 确实会运行。但如果您的目标是在登录时获得 zsh 提示符,那么这无济于事。shksh

您可以创建/bin/sh登录 shell 并将其包含export SHELL=/bin/zsh在您的 中~/.profile。然后,当您打开终端时,终端将启动 zsh(除了少数终端仿真器不遵循设置)。但是,当您通过 ssh 登录时,$SHELL您仍然会拥有。可以通过在 末尾包含 来解决这个问题(这会将正在运行的 shell 替换为 zsh),但您需要注意,只在交互式登录时这样做,而不是在从其他脚本(例如 X 会话启动)包含 时这样做(一个很好的测试是通过 获得的父进程的名称:如果它是或,那么 是安全的)。shexec zsh~/.profile~/.profileps -o comm= $PPIDsshdsuexec

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

emulate sh
. ~/.profile
emulate zsh

如果您有足够新的 zsh(在 Ubuntu 上,我认为这意味着从 lucid 开始),您可以将其简化为emulate sh -c '. ~/.profile'

.zprofile对阵.zshrc

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

当您启动终端仿真器并获取 shell 提示符时,或者当您明确启动 shell 时,您将获得一个非登录 shell。由于~/.profile(或~/.zprofile) 表示您要在登录时执行的命令,因此非登录 shell 不会读取此文件。相反,当您启动交互式 zsh 时,它会读取~/.zshrc。(Zsh 会读取~/.zshrc所有交互式 shell,无论它们是否是登录 shell;奇怪的是,bash 从不读取~/.bashrc登录 shell。)

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

答案2

对于没有耐心的人,简短的回答是:

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

需要更多信息?看看 Gilles 的精彩回答!

答案3

除了 Gilles 的回答之外,使用较新版本的 zsh,您还可以执行以下操作:

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

...这将在 zsh 的 sh-mode 生效的情况下获取 .profile 文件。并且它仅在获取过程中有效。因此,您不必保存当前选项状态以便在获取后再次重播它。

答案4

我手头上的文档只提到了/etc/profile登录~/.profileshell/兼容模式。

% zsh --version
zsh 4.3.10 …
% cat ~/.profile
echo 'Running ~/.profile...'

本机模式登录 shell(argv[0] 以 开头-)不使用~/.profile(但会使用~/.zprofile):

% zsh -c 'exec -a -zsh zsh' </dev/null

(无输出)

/兼容模式登录 shell 使用 .profile:

% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...

相关内容