bash 中的 --login 选项没有彩色输出

bash 中的 --login 选项没有彩色输出

我没有 bash 工具的彩色输出。而且确实很不方便。 (顺便说一句,我本身确实有颜色bash,例如彩色提示)。

我注意到当我跑步时/usr/bin/bash,颜色又回来了。 (但是,我没有我的个人资料设置,例如别名和路径)。

我可以看到这里唯一的区别:--login标志。我认为问题的原因在于 bash 在开始时使用--loginflag 加载的配置文件。

然而,它能是什么?

答案1

我注意到当我运行 /usr/bin/bash 时,颜色又回来了。 (但是,我没有我的个人资料设置,例如别名和路径)。

显然,设置这些东西的命令仅运行-登录外壳。

交互式登录 shell 使用与其他交互式 shell 不同的启动脚本。

设置彩色输出的命令可能位于.bashrc您的主目录中的文件中,或者位于系统范围的/etc/bash.bashrc.这些文件中的命令是为交互式 shell 运行的不是登录 shell,但它们不是从交互式登录 shell 运行,除非命令位于不同的启动脚本源中.bashrc。您应该检查这些文件。

bash作为登录 shell 启动时,它会运行主目录中存在的/etc/profile第一个.bash_profile.bash_login、 和中的命令。.profile运行man bash以获取详细信息。

即使在非交互式登录 shell 中,“配置文件”文件中的命令也可以运行,您可能不想为其设置着色,并且这样做甚至可能会产生错误。特别是,大多数桌面环境都从您的.profile文件运行命令。因此,如果将着色命令添加到“配置文件”文件中,则应考虑使其仅在交互的贝壳。此外,某些命令只能在其他 shell 中运行,bash而不能在其他 shell 中运行,并且您应该确保情况仍然如此(见下文)。

确定 shell 是否是交互式的一种方法是检查PS1提示变量是否存在并且不为空。您可以将此命令放在“配置文件”文件中您想要运行的所有命令之后,即使是对于非交互式登录 shell,但也可以放置在您想要在交互式 shell 中运行的任何命令之前:

[ -z "$PS1" ] && return

有时,交互性检查可能在“rc”文件中。

在某些操作系统中,包括 Debian 和 Ubuntu,默认.profile(从/etc/skel/创建用户帐户时复制的)源 - 即运行来自 - 的所有命令.bashrc。同样,/etc/profile来源/etc/bash.bashrc。不过,并非所有默认 shell 的操作系统都bash会这样做。可能你的系统没有。

在那些系统中,默认.bashrc/etc/bash.bashrc这样一行在任何其他命令之前的顶部。具体来说,/etc/bash.bashrc准确地保留该行,同时.bashrc检查 shell 是否以不同的方式进行交互:

case $- in
    *i*) ;;
      *) return;;
esac

这是有效的,因为交互式bashshell 有一个i特殊参数$-。我提到它主要是为了以防万一您更喜欢以这种方式检查。

有时有条件地从“配置文件”中获取“rc”是有意义的。

例如,根据您的情况,您可能希望将主目录中的任何一个“配置文件”文件设为 source .bashrc,就像 Debian 所做的那样。我不能建议您这样做,因为这取决于您在所有这些文件中实际拥有的内容。但 Debian 和 Ubuntu 的做法是这样的:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

中的命令.bashrc通常只能由 运行bash,因此您不应进行设置,以免其他 shell 无意中运行它们。这就是上面的代码所实现的。在.bash_profileor中.bash_login,您可以用 just. "$HOME/.bashrc"代替,因为只bash使用.bash_profileand .bash_login。但在 中.profile,你应该不是有一个不受保护的,因为除大多数桌面环境. "$HOME/.bashrc"之外的其他 shell也运行来自 的命令。bash.profile

如果您决定制作/etc/profile源代码,您应该采取类似的谨慎态度/etc/bash.bashrc。在所有情况下,当您使用.source内置函数从另一个启动脚本获取启动脚本(.并且source可以在 中互换bash)时,请确保您没有创建一个无限循环,其中一个文件获取另一个文件的源,而另一个文件获取原始文件的源。

你应该做什么...

...根据您提供的信息,我无法确定,因为我不知道您实际上拥有上面提到的哪些文件以及它们包含什么内容。

我相信我给出的描述应该足以让您弄清楚要进行哪些更改,但您实际上可能不确定哪些命令来自登录 shell 和非登录 shell /etc/bash.bashrc,或者.bashrc您想要在登录 shell 和非登录 shell 中运行哪些命令,以及您想要哪些命令仅为非登录 shell 保留。 (或者也许其中一些 - 例如设置环境变量,例如PATH- 您只想运行登录贝壳。)

因此,如果出于这个或任何其他原因,您想要更详细的答案,那么我建议您编辑您的问题以提供该信息:您拥有的每个文件的名称以及完整且准确的文本。 (其他寻求这方面帮助的用户当然应该不是编辑此问题,但如果首先通过搜索未找到解决方案,则应发布新问题。)

相关内容