我正在使用Ubuntu 22.04.5 LTS
以下操作系统和 bash 版本:
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
我在“man bash”的 INVOCATION 部分下发现以下内容:
当 bash 作为交互式登录 shell 或使用 --login 选项作为非交互式 shell调用时 ,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从第一个存在且可读的文件中读取并执行命令。
我知道bash可以通过两种方式“登录”:
- 零参数在名称前有一个破折号 (
-bash
) --login
bash 使用标志/选项启动。
在“man bash”中,他们明确标记了第二种情况(如果他们想标记两种情况,他们会写上“非交互式登录 shell”;Stephen Kitt在他的回答中也说这只适用于第二种情况)。这意味着如果我以第一种方式启动非交互式登录 bash,则~/.profile
不应执行文件中的命令。然而,事实并非如此。我添加echo HI
到给定文件中并在 GNOME 终端仿真器 () 中运行以下命令/dev/pts/0
以启动非交互式登录 bash:
exec -l bash -c 'echo $-;echo $0;shopt;sleep 10s'
尽管根据手册不应该显示文本(“HI”),但它还是显示在终端上。
为什么会发生这种情况?
我在这里找到了我的问题的一个潜在答案。在我看来,这个编译时选项似乎被取消注释,所以 bash 读取了“~/.profile”文件。有人知道如何检查该选项是否真的被取消注释吗?