`exec /bin/bash -il` 在 .profile 中失败

`exec /bin/bash -il` 在 .profile 中失败

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

相关内容