我很困惑我的 shell 以什么顺序来获取哪些文件。在自己研究这个问题时,我在网上找到了几个资料,甚至阅读了两个 shell 手册的某些部分。但有时,信息似乎相互矛盾且错误。
我知道不可能对所有 shell 进行完美概述,但是否有一些概述可以显示 Bash 和 Zsh 以什么顺序/情况获取了哪些文件?例如,当 shell 为非交互式时,获取文件的方式有何不同?
答案1
通过此概述,我希望消除任何困惑,并介绍一个简单的概述,说明在什么情况下为 Bash 和 Zsh 提供哪些文件。下图已在 VM 上的 archlinux vanilla 安装上进行了测试。
初创公司提交采购订单
猛击
扎什
上面的图表显示了脚本的来源顺序,具体取决于 shell 是登录、非登录、交互还是非交互。要遵循一个组合的来源顺序,请从最左边的节点开始并“选择”您的组合。您最终只会得到一种颜色,同时通过登录/交互两种选择:这就是要遵循的颜色!
图表注释
如果中的文件/etc/zsh/
存在于 中/etc/
,则其功能完全相同。两个路径相同,并且均来自 。此外,此图假设ZDOTDIR
未设置。如果设置,则 中的所有文件~
均来自ZDOTDIR
。
笔记
启动文件的类型(概述)
图表很棒,但是文字也有其细微差别,所以就这样。
有 X 种类型的启动文件(shell 启动时获取的文件):'env'、'profile'、'rc'、'login' 和 'logout',它们都来源于此 presedence。根据您的 shell,这些类型的文件的名称略有不同。所有这些类型,都有系统范围和用户范围的变体,分别放在 和 中/etc
。$HOME
中的那些$HOME
仅适用于所属用户,但系统范围的那些由每个人(甚至是 root)获取,并由系统管理员维护。
'env' 文件仅用于定义全球的变量,仅此而已!配置文件通常定义更具体的变量和函数。'rc 文件旨在用于交互式 shell,通过提示符和其他工具等丰富 shell,使交互更加轻松。'login' 和 'logout' 用于登录和注销,这样您就可以在获取某些内容时有额外的选择。
启动文件的预期用途
启动文件的所有初衷可能都不够明显。因此,这里对一些文件进行了额外的解释:
/etc/profile
:通常用于来源/etc/bash.bashrc
。*zlogin
: 的用途与 完全相同*zprofile
,但适用于依赖其他文件完全配置的 shell 的逻辑。其唯一区别在于,它确实在 之后*zshrc
而不是之前被调用。通常用于运行startx
或其他显示管理器。/etc/zsh/zprofile
:必须source/etc/profile
否则emulate sh -c
一些常用脚本比如 make 将会中断。/etc/bash.bashrc
:通常会加载 bash_functions。~/.bash_profile
:通常用于获取来源,~/.bashrc
因为~/.bashrc
在登录 shell 中时不会获取来源 - 但在某些情况下您会主动使用登录 shell。
其他值得注意的评论
- 一些发行版(我相信至少是 Manjaro)也有 Zsh 文件
/etc/
,而不是/etc/zsh/
。 两者相同,而在 Manjaro 上只会获取其中一个。 - 一些发行版,例如 ubuntu,有可供使用的额外启动文件。
- bash 中的注销脚本不会在非交互式 shell 中运行,除非执行
bye
、logout
或(或其他类似命令)。exit
- 请意识到
*zshenv
甚至来自make
!(因此,请尽可能保持这些文件简单。)*zshenv
因此,建议文件中的命令始终用以下代码括起来:
if [[ ! -o norcs ]]; then
echo 'your command'
fi
Zsh 和 Bash 的主要区别
Bash 似乎将登录 shell 的启动文件与交互式 shell 分开。如果交互式登录 shell 运行显示管理器,则通常不需要交互式 shell 所需的配置,因为无论如何您都不会直接与其交互。但是,在其他情况下(例如,使用 SSH 时),您希望获取这些交互式 shell 配置。
Zsh 不会将两者分开:交互时运行交互脚本,登录 shell 时运行登录 shell;很简单。
另外,请注意~/.profile
不是由 zsh 提供的,而是用它自己的替换~/.zprofile
。
我的采购订单是什么?
我测试了完整的采购订单,通过在前面添加以下行每一个启动文件,其中FILE_NAME
启动文件的名称是:
export startup_trace="$startup_trace\nFILE_NAME"
对于*logout
启动文件,我改为回显文件名,因为退出后无法打印更新的跟踪。
例如,要测试非交互式 Zsh 登录 shell 的跟踪,请运行以下命令:
su $SOME_USER -ls /bin/zsh -c 'setopt; echo -e $startup_trace; exit'
这将按顺序打印所有来源文件。请注意如何exit
测试*logout
启动文件。