为什么 Debian 的默认 bash shell 是无色的?

为什么 Debian 的默认 bash shell 是无色的?

我一直在寻找为什么默认的 Debian shell 是无色的,但找不到答案。

为什么 Debian shell (bash) 默认是无色的?

答案1

为什么 Debian shell (bash) 默认是无色的?

因此(在.bashrc普通 Debian 安装中,重点是我的):

# 如果终端有能力的话,取消彩色提示的注释;转身
# 默认情况下关闭,以免分散用户注意力:终端窗口中的焦点
# 应该出现在命令的输出中,而不是提示符上
#force_color_prompt=是

如果[-n“$force_color_prompt”];然后
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null;然后
    # 我们有颜色支持;假设它符合 Ecma-48
    #(ISO/IEC-6429)。 (缺乏这种支持的情况极为罕见,而且这种情况
    # 一个案例倾向于支持 setf 而不是 setaf。)
    color_prompt=是
    别的
    颜色提示=

换句话说,这是“一项功能”,或者如果您愿意的话,也可以是一种设计选择。

答案2

(问题的原始版本表明它与 root 的 shell 有关;我将其留在这里,因为它对于专门想知道这一点的用户可能有用。)

对于 root 来说,默认提示符是无色的,因为/etc/profile— 或者更确切地说,/etc/bash.bashrc— 定义了一个非常简单的提示:

# set a fancy prompt (non-color, overwrite the one in /etc/profile)
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

root的默认值.bashrc不覆盖它:

# Note: PS1 and umask are already set in /etc/profile. You should not
# need this unless you want different defaults for root.
# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
# umask 022

Debian 系统上的 /root/.bashrc 和 /root/.profile 来自哪里?更多细节。

答案3

因为这是“如何在 debian 中为 root shell 着色”搜索的最高结果,所以我在这里发布我的解决方案:复制并覆盖/root/.bashrc文件/etc/skel/bashrc

该文件比安装的文件要强大得多root,并且也是系统上创建的任何新用户的默认文件。

以下是我多年来调整的 ls 着色摘录

alias la='LS_COLORS="mh=1;37" ls -A'
alias l='LS_COLORS="mh=1;37" ls -CF'
alias ll='LC_COLLATE=C LS_COLORS="mh=1;37" ls -lA --si --group-directories-first'

答案4

我最终得到了 @daniel-sokolowski 建议看看/etc/skel/.bashrc.

但重要的是要注意,根据 bash 文档,[ -z "$PS1" ]测试是区分交互式 shell 与非交互式 shell 的常用方法。

这样当你添加

# part from /etc/skel/.bashrc
...
if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

您公开PS1=任何类型的 shell,它可能会破坏非交互式命令,例如

ssh your-server ls -la
bash completion on: scp ssh://foo:/bar/<TAB>
vim scp://your-server//some/file

当仅作为交互式 shell 一部分的脚本发生不需要的 stdout 时,此命令将被破坏。

这种方式完整的解决方案是将块包装在[ ! -z "$PS1" ]测试中

...
if [ ! -z "$PS1" ]; then
    if [ "$color_prompt" = yes ]; then
        PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    else
        PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    fi
fi
unset color_prompt force_color_prompt

相关内容