Site icon 8HOST.COM

Пользовательская настройка командной строки Bash

Командная строка очень часто используется для управления сервером Linux.

Многие дистрибутивы системы предлагают достаточно удобные настройки командной строки по умолчанию. Однако иногда возникает необходимость расширить набор функций и возможностей. В таком случае можно выполнить пользовательскую настройку командной строки.

Примечание: Руководство выполнено на Ubuntu 12.04 VPS, но большинство дистрибутивов Linux работает подобным образом.

Проверка оболочки

Прежде чем приступить к работе, нужно убедиться, что вы используете оболочку bash.

Обычно в системах Linux используется именно bash, но иногда некоторые дистрибутивы предлагают другие оболочки.

Чтобы убедиться, что вы работаете в bash, проверьте файл /etc/passwd:

less /etc/passwd

Каждая строка этого файла содержит информацию о каждом отдельном пользователе системы. Найдите в файле текущего пользователя и пользователя root (первый столбец). В последнем поле будет указана оболочка пользователя по умолчанию.

root:x:0:0:root:/root:/bin/bash
. . .
demouser:x:1000:1000:,,,:/home/demouser/bin/bash

Если в этом поле указано не /bin/bash, отредактируйте файл с правами root, указав необходимую оболочку:

sudo nano /etc/passwd

После этого выйдите и войдите снова, чтобы обновить настройки.

Просмотр текущих значений

Для начала нужно ознакомиться с текущими настройками конфигурационных файлов bash.

Командная строка bash настраивается с помощью переменных среды PS1 и PS2. PS1 определяет текст приглашения оболочки; именно его вы видите при входе в систему. В Ubuntu по умолчанию этот текст выглядит так:

username@hostname: current_directory$

Символ $ в конце строки указывает, что эта строка принадлежит обычному пользователю. Командная строка пользователя root отличается, она оканчивается символом #.

PS2 настраивает многострочные команды. Чтобы узнать текущее значение переменной PS2, введите:

echo \

Нажмите Enter. На экране появится текущее значение переменной; по умолчанию в Ubuntu это >.

Как правило, эти переменные хранятся в файле ~/.bashrc, который система читает при запуске интерактивной оболочки.

В Ubuntu 12.04 в этом файле есть такой раздел:

# 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
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

Чтобы настроить цветную командную строку, раскомментируйте параметр:

force_color_prompt=yes

Теперь нужно установить настройки командной строки. Они размещаются в блоке if-else:

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='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

Она выглядит довольно сложно и содержит непонятные компоненты.

Строки, содержащие debian_chroot, означают, что при работе в окружении chroot командная строка напомнит вам об этом. Это очень полезная функция.

Остальное определение командой строки выглядит так:

\u@\h:\w\$:

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

Управляющие последовательности bash

Чтобы получить полный список управляющих последовательностей оболочки, откройте мануал:

\a     an ASCII bell character (07)
\d     the date in "Weekday Month Date" format (e.g., "Tue May 26")
\D{format}
the format is passed to strftime(3) and the result is inserted into the prompt string; an empty format results in a locale-specific time representation.  The braces are required
\e     an ASCII escape character (033)
\h     the hostname up to the first `.'
\H     the hostname
\j     the number of jobs currently managed by the shell
\l     the basename of the shell's terminal device name
\n     newline
\r     carriage return
\s     the name of the shell, the basename of $0 (the portion following the final slash)
\t     the current time in 24-hour HH:MM:SS format
\T     the current time in 12-hour HH:MM:SS format
\@     the current time in 12-hour am/pm format
\A     the current time in 24-hour HH:MM format
\u     the username of the current user
\v     the version of bash (e.g., 2.00)
\V     the release of bash, version + patch level (e.g., 2.00.0)
\w     the current working directory, with $HOME abbreviated with a tilde (uses the value of the PROMPT_DIRTRIM variable)
\W     the basename of the current working directory, with $HOME abbreviated with a tilde
\!     the history number of this command
\#     the command number of this command
\$     if the effective UID is 0, a #, otherwise a $
\nnn   the character corresponding to the octal number nnn
\\     a backslash
\[     begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt
\]     end a sequence of non-printing characters

Как видите, на данный момент строка содержит имя пользователя (\u), символ @, первую часть имени хоста (\h), текущий рабочий каталог (\w) и символ командной строки ($ для обычных пользователей и # для root).

Теперь закройте файл ~/.bashrc.

Тестирование командной строки bash

Конечно, чтобы настроить командную строку, можно просто отредактировать   файл ~/.bashrc. Однако намного полезнее выполнить пользовательскую настройку строки с помощью самой строки.

Прежде чем приступить к настройке, сохраните текущее значение PS1, чтобы в случае неудачи можно было вернуть прежнее значение.

ORIG=$PS1

Теперь в сети есть новая переменная ORIG, в которой будет храниться текущее значение PS1.

Чтобы вернуть командную строку по умолчанию, теперь можно просто ввести:

PS1=$ORIG

Для начала попробуйте изменить текст приглашения оболочки, оставив только имя пользователя и символ $.

PS1="\u$"

Теперь строка будет выглядеть так:

demouser$

Между именем пользователя и символом можно добавить пробел:

PS1="\u $: "
demouser $:

Вместо символа $ можно использовать управляющую последовательность \$. Тогда командная строка будет динамически изменяться в зависимости от пользователя.

PS1="\u \$: "

Также в строку можно добавить любой текст, например:

PS1="Hello, my name is \u! \$: "
Hello, my name is demouser! $:

Стандартные функции оболочки позволяют вставлять результаты произвольных команд.

Например, в командной строке может отображаться текущая нагрузка на сервер. Для этого нужно загрузить метрику из файла /proc/loadavg в обратных кавычках:

PS1="\u, load: `cat /proc/loadavg | awk '{ print $1; }'` \$: "
demouser, load: 0.01 $:

Также можно добавить в командную строку время и дату. Для этого используйте:

PS1="[\u@\h, load: `cat /proc/loadavg | awk '{ print $1; }'`] (\d - \t) \w \$ "
[demouser@host, load: 0.01] (Thu Feb 20 - 13:15:20) ~ $

Однако если путь к каталогу очень длинный, строка будет выглядеть довольно сложно.

cd /etc/systemd/system/multi-user.target.wants
[demouser@host, load: 0.01] (Thu Feb 20 - 13:18:28) /etc/systemd/system/multi-user.target.wants $

Чтобы сохранить в строке всю эту информацию, но упростить её восприятие, можно разделить её на две строки при помощи символа \n:

PS1="[\u@\h, load: `cat /proc/loadavg | awk '{ print $1; }'`] (\d - \t)\n\w \$ "
[demouser@host, load: 0.00] (Thu Feb 20 - 13:20:00)
/etc/systemd/system/multi-user.target.wants $

Многие пользователи предпочитают не делить командную строку, однако иногда это бывает необходимо.

Настройка цвета

Bash позволяет добавлять цвета в командную строку при помощи специальных кодов.

Чтобы определить цвет, код нужно поместить в скобки \[  и \]. Если код цвета не будет заключен в такие скобки, оболочка прочитает его буквально и просто выведет на экран.

Затем цвет нужно задать внутри последовательности скобок \[, например:

\e[

или

\033[

Перед последовательностью \] нужно добавить m, чтобы указать, что ы задаёте код цвета.

В целом синтаксис настройки цвета выглядит так:

\[\e[color_informationm\]

Конечно, такой код выглядит достаточно сложно.

Коды цветов:

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

Это поведение отличается зависимости от используемого терминала. Общие атрибуты:

К примеру, чтобы получить подчёркнутый зелёный текст, нужно ввести последовательность:

\[\e[4;32m\]

Чтобы сбросить настройки цвета, используйте такую последовательность:

\[\e[0m\]

Простая командная строка с именем пользователя и хостом будет выглядеть так:

PS1="\[\e[4;32m\]\u@\h\[\e[0m\]$ "

Также можно настраивать цвет фона.

Чтобы задать цвет фона, цвет текста и атрибут, используйте:

\[\e[42;1;36m\]
Как правило, информацию о фоне лучше отделять от остальных настроек:

\[\e[42m\]\[\e[1;36m\]

Иногда при использовании обычного текста (0) в некоторых терминалах не работают настройки цвета текста. Чтобы обойти эту проблему, нужно просто не вводить настройки нормального текста, так как они используются по умолчанию.

Сохранение настроек командной строки

Итак, теперь вы умеете настраивать цветной текст. В руководстве используется такая последовательность:

PS1="[\[\e[0;32m\]\u@\h, load: `cat /proc/loadavg | awk '{ print $1; }'`\[\e[00m\]] (\[\e[00;35m\]\d - \t\[\e[00m\])\n\w \$ "

Также можно отключить использование цвета:

PS1="[\u@\h, load: `cat /proc/loadavg | awk '{ print $1; }'`] (\d - \t)\n\w \$ "

Теперь можно отредактировать переменную PS1 в файле ~/.bashrc:

nano ~/.bashrc

Как уже говорилось, если вы работаете в окружении chroot, командная строка может сообщить об этом. Эта функция сейчас включена, не отключайте её. Теперь значение переменной будет таким:

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 и скопируйте следующую логику debian_chroot:

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

Перед последними кавычками нужно вставить код пользовательских командных строк. Поскольку текущее определение командной строки использует одинарные кавычки, нужно заменить их двойными.

В первом определении PS1 укажите настройки цветной командной строки, во втором – командной строки без цвета.

if [ "$color_prompt" = yes ]; then
# PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
PS1="${debian_chroot:+($debian_chroot)}[\[\e[0;32m\]\u@\h, load: `cat /proc/loadavg | awk '{ print $1; }'`\[\e[00m\]] (\[\e[00;35m\]\d - \t\[\e[00m\])\n\w \$ "
else
# PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
PS1="${debian_chroot:+($debian_chroot)}[\u@\h, load: `cat /proc/loadavg | awk '{ print $1; }'`] (\d - \t)\n\w \$ "
fi
unset color_prompt force_color_prompt

Сохраните и закройте файл.

Вы сможете пользоваться новой командной строкой в новой сессии.

Заключение

Bash предлагает множество пользовательских настроек и функций. Часто пользователи настраивают командную строку root, чтобы не спутать её со строкой обычного пользователя.