![`exec /bin/bash -il` 在 .profile 中失败](https://linux22.com/image/908934/%60exec%20%2Fbin%2Fbash%20-il%60%20%E5%9C%A8%20.profile%20%E4%B8%AD%E5%A4%B1%E8%B4%A5.png)
Bash 手册页说:
读取该文件(/etc/profile)后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从第一个存在且可读的文件读取并执行命令。
因此,如果我同时拥有 a~/.bash_profile
和 a ~/.profile
,则只会运行第一个。
因为我经常在不同的系统之间共享一个 HOME,所以我将两者都进行了硬链接。在 18.04.2 上,登录将返回到登录屏幕。由于每个文件都是单独但相同的文件,因此会发生相同的情况。要在系统和可用 shell 之间共享,my.profile
包含一个case
基于的语句$0
,根据需要进行设置或执行首选 shell。实际上它的作用是:
case $0 in
*bash) ... some stuff ...
;;
*) exec /bin/bash -il
;;
esac
在副本中将a 放在#
前面,一切正常......exec
.profile
是.bash_profile
相同的(除了我插入一个时#
的.profile
)。
事实证明,18.04.2 对exec
中的那个相当满意~/.bash_profile
,但 中的不满意~/.profile
(它无论如何都不应该读取)。当它在那里时,登录需要密码 → 短暂黑屏 → 再次登录窗口。当它被注释掉时,登录正常进行。此外,shell 是 Bash,因此该案例的分支也不应该被采用。
有什么想法吗?
答案1
GUI 登录过程可能使用/etc/profile
和~/.profile
来设置环境变量等,并且可能使用/bin/dash
或/bin/bash
来实现这一点。Ask Ubuntu 有许多 GUI 登录失败的例子,原因是~/.profile
或中的错误/etc/profile
。您不应该exec
在这些文件中添加其他内容,而至少要检查交互式使用情况。例如,默认.bashrc
在顶部有这个,您可以调整它:
~ head /etc/skel/.bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac