почему оболочка Debian по умолчанию является бесцветной?

Если это соответствует вашему рабочему процессу, вы можете заставить awk сам открывать канал. Вы не можете сделать это для элемента ARGV , поэтому вы не получите автоматической итерации awk для строк, считываемых из конвейера. Вместо этого awk будет читать из файлов, переданных в качестве аргументов командной строки, или из стандартного ввода, если аргументов файла не было.

{
    printf "Enter input: "
    getline var
    while (("cat file.txt" | getline) > 0) { … }
}

Эта структура не подходит для вашего игрушечного примера, но я упоминаю ее, потому что она может соответствовать вашей реальной проблеме.

5
29.03.2017, 13:02
3 ответа

почему оболочка Debian по умолчанию бесцветная

Из-за этого (из .bashrc в обычной установке Debian, выделено мной):

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # We have color support; assume it's compliant with Ecma-48
    # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
    # a case would tend to support setf rather than setaf.)
    color_prompt=yes
    else
    color_prompt=
    fi
fi

Другими словами, это «особенность» , или выбор дизайна, если хотите.

16
27.01.2020, 20:33

Полагаю, вы имеете в виду: «Почему root bash по умолчанию в Debian приглашение бесцветное?»), Верно?

Если так, то это просто потому, что / 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

См. Откуда берутся /root/.bashrc и /root/.profile в системе Debian? для получения более подробной информации.

5
27.01.2020, 20:33

Я получил предложение @daniel -sokolowski посмотреть на /etc/skel/.bashrc.

Но важно отметить, что, согласно документации bash, тест [ -z "$PS1" ]является обычным способом отличить интерактивную оболочку от не -интерактивной.

Таким образом, когда вы добавляете

# 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=для любого типа оболочки, и это может нарушить работу не -интерактивных команд, таких как

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

Эти команды будут нарушены, если нежелательный стандартный вывод произойдет из сценариев, предназначенных только для использования в интерактивных оболочках.

Таким образом, полное решение состоит в том, чтобы обернуть блок в [ ! -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
0
05.11.2020, 05:48

Теги

Похожие вопросы