我刚刚在 Ubuntu 系统上安装了 zsh。似乎 zsh 在初始化时没有执行 ~/.profile。据我所知,这应该是一种自动行为。我遗漏了什么?
答案1
.profile
对阵.zprofile
当 Zsh 作为登录 shell 调用时,它会运行~/.zprofile
,而不是~/.profile
。原因是 zsh 与标准 shell 存在足够的不兼容性,从而会破坏脚本。
如果以或~/.profile
形式调用,Zsh 确实会运行。但如果您的目标是在登录时获得 zsh 提示符,那么这无济于事。sh
ksh
您可以创建/bin/sh
登录 shell 并将其包含export SHELL=/bin/zsh
在您的 中~/.profile
。然后,当您打开终端时,终端将启动 zsh(除了少数终端仿真器不遵循设置)。但是,当您通过 ssh 登录时,$SHELL
您仍然会拥有。可以通过在 末尾包含 来解决这个问题(这会将正在运行的 shell 替换为 zsh),但您需要注意,只在交互式登录时这样做,而不是在从其他脚本(例如 X 会话启动)包含 时这样做(一个很好的测试是通过 获得的父进程的名称:如果它是或,那么 是安全的)。sh
exec zsh
~/.profile
~/.profile
ps -o comm= $PPID
sshd
su
exec
同时使用 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
对于没有耐心的人,简短的回答是:
~/.profile
zsh
登录时未加载。zsh
~/.zprofile
登录时加载。zsh
~/.zshrc
在启动新的终端会话时加载。
需要更多信息?看看 Gilles 的精彩回答!
答案3
除了 Gilles 的回答之外,使用较新版本的 zsh,您还可以执行以下操作:
[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'
...这将在 zsh 的 sh-mode 生效的情况下获取 .profile 文件。并且它仅在获取过程中有效。因此,您不必保存当前选项状态以便在获取后再次重播它。
答案4
这嘚我手头上的文档只提到了/etc/profile
登录~/.profile
shell什/什兼容模式。
% 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...