Настройка bash в linux

Обновлено: 04.07.2024

Оболочка bash поддерживает все интерактивные возможности, столь важные для пользователя, как то: автодополнение для команд и путей к файлам, историю оных (включая средства инкрементного поиска), мощные возможности навигации и редактирования командной строки. Важно, что существует дополнительный пакет bash-completion (в Kubuntu он устанавливается по умолчанию): установка его обогащет базовую оболочку множеством опциональных средств настройки автодополнения (в том числе и для командных аргументов). Правда, чтобы эта дополненная оболочка была по настоящему удобной и функциональной, нужно приложить некоторые усилия по ее настройке, чем мы и займемся в данном параграфе.

/.bash_profile , после чего происходит обращение к

/.bashrc . Обычно в

/.bash_profile определяются переменные окружения, которые должны действовать для всех дочерних процессов, а в

Впрочем, в Kubuntu, ориентированном на графичесёкий режим и, следовательно, использование эмулятора терминала с интерактивным шеллом, не являющимся, тем не менее, шеллом пользовательским (login shell),

/.bash_profile играет сугубо служебную роль, и содержимое его сводится к отработке файла

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

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

Так, по умолчанию в bash автодополнение клавишей табулятора не работает, например, в аргументах многих команд, таких, как sudo или man . Решается эта задача очень просто: достаточно файл

/.bashrc внести следующие строки:

Если в файл /etc/inpurc (или в

/inpurc ) добавить такие строки:

то набор части команды, например, cd / , и последующий перебор стрелками <Up> и <Down> истории команд повлечет извеление из буфера истории только тех из них, которые начинаются на cd / .

Очень полезно в файле

Устанавливаются псевдонимы одноименной командой alias , в качестве аргументов которой выступают имя псевдонима и его значение, соединенные оператором присваивания (именуемым в просторечии знаком равенства). А именно, если мы хотим ныне, и присно, и во веки веков видеть вывод команды ls в цвете, нам достаточно вписать в конфиг bash такой псевдоним:

Но что, если заведомо известно, что сотни, а то и тысячи файлов целевого каталога должны быть именно переписаны новыми своими версиями? В этом случае можно прибегнуть к опции -f (или --force ). Которая, отменяя действие опции -i , предписывает принудительно переписать все файлы целевого каталога их обновленными тезками. И никто не мешает нам на этот случай создать еще один псевдоним для команды cp , например:

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

без опций и аргументов выведет полный их список.

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

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

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

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

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

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

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

Чтобы убедиться, что вы работаете в bash, проверьте файл /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 по умолчанию этот текст выглядит так:

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

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

Как правило, эти переменные хранятся в файле

/.bashrc, который система читает при запуске интерактивной оболочки.

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

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

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

Верхняя часть кода включает поддержку цвета.

Для примера разберём следующую строку:

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

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

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

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

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

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

Теперь закройте файл

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

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

/.bashrc. Однако намного полезнее выполнить пользовательскую настройку строки с помощью самой строки.

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

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

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

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

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

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

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

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

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 позволяет добавлять цвета в командную строку при помощи специальных кодов.

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

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

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

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

\[\e[ color_information m\]

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

  • 30: черный
  • 31: красный
  • 32: зелёный
  • 33: жёлтый
  • 34: синий
  • 35: фиолетовый
  • 36: бирюзовый
  • 37: белый

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

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

  • 0: обычный текст
  • 1: жирный (зависит от терминала)
  • 4: подчёркивание

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

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

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

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

  • 40: черный фон
  • 41: красный фон
  • 42: зелёный фон
  • 43: жёлтый фон
  • 44: синий фон
  • 45: фиолетовый фон
  • 46: Cyan фон
  • 47: белый фон

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

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

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

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

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

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

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

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

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

Закомментируйте текущее значение PS1 и скопируйте следующую логику debian_chroot:

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

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

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

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

Заключение

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

Сегодня, в очередной раз разбираясь с работой в консоли Линукс я решил, для удобства немного подредактировать свой файл .bashrc Данный фаил отвечает за то что выводится на экран во время нашей работы в bash. Вообще настроек в bash существует достаточно много и я ещё не со всеми разобрался, да и не все пока разбирал. Например я пока не разбирал цветную настройку консоли. А знаю что консоль можно разукрасить практически как новогоднюю Ёлку. Но всему своё время.


Изменений в файле ".bashrc" на сегодня я хоть и сделал не так и много, но это уже позволяет значительно упростить мою работу и обучение работе с консолью.


Файл ".bashrc" находится в нашей домашней директории вот здесь

/.bashrc, как видите знак тильды указывает на то что фаил находится в Вашей домашней директории, как я это уже говорил ранее в статье, когда описывал команды для передвижения по директориям в системе Линукс, в консоли. Точка с которой начинается название файла говорит нам о том что файл скрыт. Дабы в него не лазили те кто совершенно ничего не понимают в своей операционной системе и не наделали в нем глупостей. Те же кто стремится к тому чтобы узнать о своей операционной системе больше, как и я, а так же быть не только пользователем в своей системе, но и иметь возможность сделать с неё все что угодно, всегда могут в него попасть и подредактировать. Конечно для этого необходимо знать что необходимо делать, но это уже такое, если человеку что-либо интересно со временем он узнает. Как говорится если ты что-либо делаешь один день, ты новичок. Если ты что-либо делаешь десять тысяч дней, ты уже мастер.


Что-то я в философию ударился, хорошо что когда-то было научился печатать в слепую и сейчас записываю практически с той же скоростью что и думаю. Давайте просмотрим в консоли, наш скрытый фаил. Для этого откроем его в консольном текстовом редакторе, в том который вы используете. Я лично использую консольный текстовый редактор vim, раньше потратил достаточно много времени на его изучение и мне в нем очень комфортно работать. Если он у вас установлен наберите в консоли.


Если консольный текстовый редактор vim у вас не установлен, можете воспользоваться другими например vi, либо nano ну или любым другим. Например вот так


Вот мы видим настройки с которыми работает наш bash, их мы и будем корректировать. )) Меня первый раз это слегка испугало, много всего и ничего непонятно. Затем немного почитал, ну и соответственно узнал немного больше.


Вводим вот такие строки, для того чтобы в историю вписывались все команды


Далее увеличиваем размер истории команд терминала. Для этого находим такую строку. Различаться она может лишь цифрами.


Пятьсот команд в истории чрезвычайно мало. Меняем цифру 500 на 10000. Будет выглядеть вот так.


Далее говорим терминалу чтобы не вносил в историю копии команд. Для этого добавляем вот такую строку.


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


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


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


Делаем возможным использование маски. Позволяет использовать конструкцию вида ** которая обозначает все файлы, начиная с текущего каталога. Очень полезно бывает для поиска определенных файлов. Например для того чтобы просмотреть все файлы в домашнем каталоге с расширением flv мне в домашнем каталоге достаточно набрать ls **/*.flv. Так же удобно находить и другие файлы. Например свою коллекцию музыки в mp3 формате.


Вот и для начала все. То как показывать часы при запуске терминала и многое другое, я опишу в следующий раз. Как сам это окончу и решусь описать.

Если вы нашли эту страницу в поиске, то наверняка пытаетесь решить какую-то проблему с запуском bash.

Возможно, в вашем окружении bash не устанавливается переменная среды и вы не понимаете, почему. Возможно, вы засунули что-то в различные загрузочные файлы bash или в профили, или во все файлы наугад, пока это не сработало.

Диаграмма

Эта блок-схема обобщает все процессы при запуске bash.


Теперь подробнее рассмотрим каждую часть.

Login Shell?

Сперва нужно выбрать, находитесь вы в командной оболочке входа (login shell) или нет.

Оболочка входа — это первая оболочка, в которую вы попадаете при входе в систему для интерактивного сеанса. Оболочка входа не требует ввода имени пользователя и пароля. Вы можете форсировать запуск оболочки входа, добавив флаг --login при вызове bash , например:


Оболочка входа настраивает базовую среду при первом запуске оболочки bash.

Интерактивный?

Затем вы определяете, является оболочка интерактивной или нет.

Это можно проверить по наличию переменной PS1 (она устанавливает функцию ввода команд):


Или посмотреть, установлен ли параметр -i , с помощью специальной переменной дефиса - в bash, например:


Если в выдаче есть символ i , то оболочка является интерактивной.

В оболочке входа?

Если вы находитесь в оболочке входа, то bash ищет файл /etc/profile и запускает, если он существует.

Затем ищет любой из этих трёх файлов в следующем порядке:


Когда находит один, то запускает его и пропускает другие.

В интерактивной оболочке?

Если вы находитесь в интерактивной оболочке без входа в систему (non-login shell), предполагается, что вы уже побывали в оболочке входа, окружение настроено и будет унаследовано.

В этом случае выполняются по порядку следующие два файла, если они существуют:

Ни один вариант?

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

В этом случае bash смотрит на переменную BASH_ENV вашей среды и выполняет соответствующий файл, который там указан.

Типичные трудности и эмпирические правила

Задания cron

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

Эта проклятая задача работает нормально, когда я запускаю её в командной строке, но фейлится при запуске в crontab.

Здесь две причины:

  • Задания cron не являются интерактивными.
  • В отличие от скриптов в командной строке, задания cron не наследуют среду оболочки.

Вот почему зачастую приходится установить конкретный PATH для задачи cron, как здесь:

Скрипты, вызывающие друг друга


Ещё одна распространенная проблема, когда скрипты по ошибке настроены на вызов друг друга. Например, /etc/profile обращается к

Образ Docker в песочнице

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

Для принудительного логина и имитации оболочки входа:


Для проверки набора переменных BASH_ENV :


Для отладки crontab каждую минуту выполнятся простой скрипт (в /root/ascript ):

Читайте также: