Наша программа настолько сурова, что даже логин отображается звездочками (bash.org.ru)
Вашему вниманию представляется новая подборка средств общения скриптов с пользователем. Надеюсь, интересно будет всем, кто не боится работать с консолью.
Первую часть можно найти тут.
Опции (ключи)
Этот способ был достоин первой части статьи, но не попал туда из-за забывчивости автора. Несомненно, этот способ знаком всем пользователям *nix, хоть раз работавших с консолью. Простой наглядный пример:
Плюс в том, что ключи короткие и их можно комбинировать. Попытаемся сделать что-нибудь подобное, а за одно изучим еще несколько моментов.
#!/bin/bash set -e ME=`basename $0` function print_help() { echo "Работа с файлом test_file" echo echo "Использование: $ME options..." echo "Параметры:" echo " -c Создание файла test_file." echo " -w text Запись в файл строки text." echo " -r Удаление файла test_file." echo " -h Справка." echo } function create_file() { touch test_file } function write_to_file { echo "$TEXT" >> test_file } function remove_file { rm test_file } # Если скрипт запущен без аргументов, открываем справку. if [ $# = 0 ]; then print_help fi while getopts ":cw:r" opt ; do case $opt in c) create_file; ;; w) TEXT=$OPTARG; write_to_file ;; r) remove_file ;; *) echo "Неправильный параметр"; echo "Для вызова справки запустите $ME -h"; exit 1 ;; esac done
Итак, что мы имеем?
- Команда set -e остановит скрипт, если при его выполнении возникнет ошибка (подробнее о других опциях здесь).
- Основные операции скрипта упакованы в функции. Конечно, глупо помещать в функции по одной команде, но это лишь для примера, в реальности их может быть ну очень много.
- Функция getopts разбирает переданные аргументы. За ней перечисляются допустимые опции. Двоеточие после опции 'w' означает, что c данной опцией идет дополнительный аргумент, который помещается в переменную $OPTARG.
- Опции можно комбинировать, но стоит учитывать то, что они выполняются по порядку. Это значит, что если мы выполним script -rc то сначала файл будет удален, а затем создан. При этом, если файла не существовало, то скрипт завершится с ошибкой, не дойдя до создания файла.
- Также стоит учитывать то, что после ключа 'w' обязательно должен следовать аргумент. Если он будет отсутствовать, то скрипт выполнит опцию '*' (по умолчанию). Интересно, что если запустить script -wr Hallo, то опция 'r' будет воспринята как дополнительный параметр к опции 'w', а 'Hallo' проигнорировано. Правильно будет script -w Hallo -r
Подробнее о getopts можно узнать здесь.
Выбор
В предыдущей статье я рассматривал выбор варианта выполнения с помощью case. А сейчас рассмотрим создание меню с помощью конструкции select, которая позволяет создать простые нумерованные меню.
#!/bin/bash # Изменение строки приветствия PS3='Выберите операционную систему: ' select OS in "Linux" "Windows" "Mac OS" "BolgenOS" do echo echo "Вы выбрали $OS!" echo break done
Подробнее описано здесь.
Логирование
Бывает удобно не выводить сообщения на экран, а записывать их в лог-файл. Особенно если скрипт запускается при старте системы.
Для этого можно использовать обычную запись в файл.
#!/bin/bash NAME=`basename $0` TIME=`date +%F\ %H:%M:%S` TYPE='<info>' echo "$TIME $NAME: $TYPE Operation completed successfully" >> /tmp/log
Но есть и специальный инструмент ведения логов — logger.
logger Operation completed successfully sudo tail /var/log/syslog
Подробнее тут.
Оповещения на рабочем столе
Немножко развлечемся и поиграемся с нотиферами. Для начала поставим нужный пакет:
sudo apt-get install libnotify-bin
Теперь выполним простейший пример прямо в терминале:
notify-send --expire-time=10000 "Привет" "Я слежу за тобой"
Об этом уже писали на Хабре.
Клавиатурные индикаторы
Хотите поморгать лампочками на клавиатуре? Да, пожалуйста!
#!/bin/bash setleds -D +caps < /dev/tty7 sleep 1 setleds -D -caps < /dev/tty7
Скрипт необходимо запускать с правами рута!
Звуковые сигналы
Звуковые сигналы можно подавать несколькими способами:
- С помощью управляющей последовательности на системный динамик
echo -e "\a"
- С помощью утилиты beep
beep 659 120
- Консольными плеерами, например aplay, mplayer и т.д.
- Синтезатором речи.
Первые два способа у меня не сработали, скорее всего из-за настроек терминала.
Открытие/закрытие сидирома
#!/bin/bash # открыть сидиром eject # закрыть сидиром eject -t
«Это не интерфейс!» — скажете вы. Но факты доказывают обратное.