Распаковка нескольких тарболлов сразу
Есть такая задача, распаковать кучу тарболлов сразу. Например, если накачать каких-то пакетов, тем оформления и проч. Приведенное решение вытекает из знания синтаксиса bash
for i in *.tar.gz; do tar xzvf $i; done
В целом, такие вещи можно делать много с чем, далеко не только с распаковкой.
2 years ago
April 7, 2010
Тюнинг приглашения в bash
Недавно я понял, что под виндами, какими бы чудесными они не были (я это о Windows 7), сидеть как-то неуютно. Насколько здорово то, что привыкаешь к хорошему, а именно к системе на linux. Дабы не страдать от супер-пупер-видеокарты под арклинуксом, я решил схалтурить во благо экономии времени, поставил федору (Russian Fedora Remix 12). Стало комфортно. Это была прлюдия.
PS1. Только что добавил читабельности в вывод командной строки добавлением в ~/.bashrc вот чего:
PS1 = \[\e[0;34m\][\A|\[\e[1;34m\]\u \[\e[0;34m\]\w]$\[\e[0m\]
А в /root/.bashrc строку добавил немного другую:
PS1 = \[\e[0;34m\][\A|\[\e[1;31m\]\u \[\e[0;34m\]\w]\$\[\e[0m\]
Разница этих вариантов только в цвете имени пользователя. Как может быть поняно наметанному глазу, имя компьютера в приглашении командной строки не выводится, поскольку в этом я не вижу для себя ниакого смысла, зато экономится место в строке за счет отсуствия всякого «shix-rfremix» после «@». Наглядно это выглядит так:

Что значат все эти символы и как проявить свою фантазию? Привожу статью из «Убунтологии», с минимальным корректировками.
За строку приглашения отвечают такие переменные среды, как PS1, PS2, PS3, PS4 и PROMPT_COMMAND.
- PS1 — переменная, которая задает вид строки приглашения командной строки, которое bash выводит, когда ожидает ввода очередной команды пользователем.
- PS2 — переменная, отвечающая за вторичный тип приглашения ввода.
- PS3 — третичное приглашение, выводится тогда, когда пользователь должен сделать выбор в операторе select.
- PS4 — приглашение четвертого уровня, выводится при отладки сценариев (скриптов) в начале каждой строки перед командой перед исполняющейся командой.
- PROMPT_COMMAND — содержимое этой переменной выполняется перед каждой строкой приглашения.
Значение каждой переменной можно узнать, введя в терминале:
$ echo $имя_переменной (как на картинке выше)
Изменить значение переменной можно двумя способами. Способ первый — указать значение непосредственно в терминале с помощью команды export:
$ export имя_переменной=’значение’
Способ второй — с помощью вашего любимого редактора дописать в .bashrc требуемые значения.
Для указания значений этой переменной используется специальный формат из управляющих последовательностей и обычного текста. Специальные управляющие последовательности упрощают настройку внешнего вида приглашения командной строки.
К примеру, следующая последовательность «\$» заставляет Bash отображать знак доллара ($), когда пользователь является обычным пользователем системы, но заменяет знак доллара решеткой (#), когда пользователь является суперпользователем (root).
Каждая специальная последовательность начинается с обратной косой черты (backslash) — «\».
К примеру, последовательность «\u» указывает, что надо отобразить имя пользователя, «\h»— имя хоста, «\w»— текущую папку.
Теперь объединим всё, чтобы получить приглашение примером выше:
PS1=’\u@\h:\w\$ ’
Знак «собаки» (@) и двоеточия не предварёны обратной косой чертой (\), поэтому они выводятся на экран как есть. Конец строки заканчивается символом пробела, чтобы набираемый в командной строке текст отделялся от приглашения командной строки.
Вот некоторый управляющие последовательности:
\d Дата в формате «День, месяц, число», например, Срд, Окт, 17.
\h Имя хоста (hostname) до первой точки
\H Полное имя хоста
\t Текущее время в 24-часовом формате: HH:MM:SS (часы:минуты:секунды)
\T Текущее время в 12-часовом формате: HH:MM:SS
\@ Текущее время в 12-часовом формате am/pm
\u Имя пользователя, запустившего оболочку
\w Полное имя текущего рабочего каталога (начиная с корня)
\W Текущий рабочий каталог (без указания пути)
\$ Символ #, если оболочка запущена суперпользователем, и символ $, если оболочка запущена обычным пользователем.
\n Новая строка (перевод строки)
\s Имя оболочки
\# Текущий номер команды
\! Порядковый номер данной команды в истории команд
\ Обратный слэш (a backslash)
\nnn Непечатный символ, имеющий восьмеричный код nnn (к примеру esc)
\a Звуковой сигнал (ASCII-код 007)
\e escape (ASCII-код 033)
\[ Начало последовательности не печатаемых символов (этот символ может быть использован для того, чтобы включить в текст подсказки последовательность управляющих символов терминала)
к\] Конец последовательности не печатаемых символов
Например, установка переменой
PS1=’[\A]\u@\h:\w\$ ’
заменяет, скажем, на такое значение:

С помощью специальных непечатаемых последовательностей можно изменить цвет приглашения командной строки, что выделит его из обычного текста. Чтобы показать, что вводится значение цвета, необходимо ввести управляющую ASCII-последовательность \e (или восьмеричный ASCII-кодом \033).
Одна и проблем, которая возникает при использовании не печатных последовательностей, заключается в том, что Bash вычисляет количество символов в приглашении командной строки и использует это число для размещения текста в терминальном окне. Так как коды цветов не выводятся на экран, то они мешают корректному подсчету. Чтобы предотвратить подсчет непечатаемых символов, управляющие последовательности необходимо заключать в управляющие скобки \[ и \]. Для того что бы лучше понять, предлагаю испробовать оба варианта: со скобками и без онных и посмотреть разницу.
Изменению в командной строке поддаётся не только текст, но и фон, поэтому формат цвета можно указать двумя способами — для фона и цвета текста или только для текста.
Формат последовательности для фона и цвета:
\[\е[#;##;#;##m\]
Формат последовательности только для текста:
\[\е[#;##m\]
Где # - специальный номер свойства цвета, а ## - специальный номер цвета. Свойством цвета может быть, например, повышенная или пониженная яркость. В формате для фона и цвета в начале указывается фон, а после цвет самого текста.
Код Свойство
0 Значение по умолчанию
1 Повышенная яркость
2 Пониженная яркость
3 Подчеркнутый
4 Нормальная яркость
7 Инвертированный
8 Скрытый
Текст Фон Цвет
30 40 Черный
31 41 Красный
32 42 Зеленый
33 43 Желтый
34 44 Синий
35 45 Фиолетовый
36 46 Голубой
37 47 Белый
Полный список кодов цветов зависит от типа используемого терминала. (И, вообще, попробуйте сами все эти комбинации, поскольку для terminator’а есть расхождения — прим. Gerfert)
Подытожим раскрасив предыдущее приглашение командной строки следующим образом — время ярко-красным цветом, имя пользователя ярко-жёлтым, имя хоста ярко фиолетовым, а текущий рабочий каталог ярко-синим цветом и в конце приглашения командной строки отметим установку цветового кода в ноль (который обозначает значение по умолчанию):
PS1=’\[\e[1;31m\][\A]\[\e[1;33m\]\u@\[\e[1;35m\]\h:\[\e[1;34m\]\w\$\[\e[0m\] ’
Результат:

Приведу ещё один пример с использованием фона: время раскрасим черным на белом фоне, а всё остальное ярко-синим:

PS2. Вторичная строка приглашения появляется, к примеру, когда ввод команды в первичном приглашении переносится на следующую строку. Сообщить командному интерпретаторуо том, что ввод продолжается в следующей строке, можно, введя обратную косую черту «\» в конце строки и введя Enter. По умолчанию отображается как «>». Формат этой переменной идентичен формату переменной PS1.

А вот почти тот же пример, но строка приглашения разукрашена. Более читабельно?

PS3. Этот вид приглашения используется в скриптах, когда нужно сделать выбор при использовании оператора select. Простой наглядный пример bash-скрипта и его вывод:
#!/bin/bash
# Пример третичного приглашения
# установим PS3 для выбора ответа в виде трёх знаков больше
PS3=”»> “
echo -e “\nВаш любимый сайт ?”
select answer in «www.ubuntologia.ru» «www.microsoft.com»
do
echo -e ’\e[37;44m’”\e[1mВаш выбор — $answer.\e[0m”
echo -e “Продолжение работы скрипта…\n”
break
done
exit 0

PS4. Приглашение четвертого уровня PS4 так же используется в скриптах. К примеру ключ -v заставляет выводить на экран терминала каждую команду прежде, чем она будет исполнена. Ключом -x подобно ключу -v, но выполняет подстановку команд и перед каждой командой выведет четверичное приглашение. Пример bash-скрипта и его вывод:
#!/bin/bash -x
# Пример третичного приглашения
PS4=’команда > ’ # установим приглашение четвертого уровня
echo “Команда номер 1”
echo “Команда номер 2”
echo “Команда номер 3”
echo “Команда номер 4”

PROMPT_COMMAND. С помощью этой переменной можно задать выполнение определённых команд перед каждым первичным приглашением. В основном, она используется, когда нужно расширить возможности первичного приглашения, вызывая какую-то дополнительную функцию или команду или даже целый скрипт. К примеру, я хочу, чтобы перед каждым первичным приглашением происходил вывод текущего каталога и календаря на месяц:
PROMPT_COMMAND=’ls; cal’

Так как эта переменная более функциональна, ею можно заменить первичное приглашение, но при этом надо уметь писать скрипты для Bash, что выходит за рамки повествования. Для более подробной информации читайте
man bash
P.S.: спасибо драг-н-дропу за легкое наполнение сего поста картинками
P.P.S.: в общем, мои приглашения выглядят как закрашенный фон и белый текст поверх. синий фон для обычного пользователя, красный — для рута.
RSS
Archive
Mobile