LXF168:Командная строка. Pdmenu
|
|
|
pdmenu: Меню оболочки
Содержание |
Простой способ запускать команды в терминале
Нейл Ботвик рассказывает о простой системе, с помощью которой можно создавать простые меню, чтобы не запоминать сложные команды.
Терминал – одно из главных достоинств Linux, но неопытным пользователям он может казаться пугающим, незнакомым и слегка недружелюбным. Как-то я работал в своем любимом терминале Konsole, и один из моих домашних спросил: «А откуда ты знаешь, какие кнопки нажимать?» И это ожидаемая реакция от людей, привыкших работать с кнопками и меню с всплывающими подсказками. Пускай графический интерфейс оставляет нам меньше выбора, но зато ясны варианты, из которых выбирать. Что же делать, когда новичку нужно выполнить несколько команд в терминале – потому, что эти действия нельзя сделать через графический интерфейс, или при работе с компьютером через SSH (а то и при подключаении с компьютера с Windows с помощью PuTTY)?
Один из вариантов – написать скрипт с помощью графических программ для создания скриптов, вроде Zenity или Kommander, но для этого нужна подходящая рабочая среда или, по меньшей мере, должны быть установлены нужные утилиты. Также есть программы типа dialog, с помощью которых в терминале можно создавать диалоговые окна ncurses; они тоже эффективно работают по SSH, даже из другой ОС.
И еще один вариант – дать пользователю способ запустить несколько команд, не погружая его во все возможности оболочки. Все эти проблемы можно решить с pdmenu (http://joeyh.name/code/pdmenu), причем вам даже не придется ничего программировать.
Простой пример
У pdmenu один файл настройки. По умолчанию, если он не задан, программа будет искать его в ~/.pdmenurc, а если там его нет – в /etc/pdmenurc. Чтобы задать другой файл, укажите его при запуске pdmenu как аргумент:
pdmenu /path/to/config.file
Это простой текстовый файл, следующий стандартным соглашениям. Комментарии помечаются #; для лучшей читаемости можно применять отступы, но программа их игнорирует. Вот простой пример, который позволяет монтировать, выводить список содержимого, проигрывать и выкатывать DVD-диск:
color:desktop:blue:blue
color:title:blue:white
color:base:blue:white
menu:main:Main Menu:This is the main menu
exec:Mount DVD::pmount /dev/dvd
exec:List DVD:display:lsdvd
exec:Play DVD::vlc dvd://
exec:Eject DVD::eject /dev/dvd
exit:Exit
Первые три строки – чистая косметика, в них задается цветовая схема; затем мы определяем одно меню. Строка, определяющая меню, состоит из трех элементов: названия меню, заголовка над меню и (необязательно) подсказки, которая отображается в нижней части окна. Затем определяются пункты меню. Отступы игнорируются, но упрощают читаемость пунктов меню в тексте. Команда exec запускает программу; у нее есть три параметра, опять же разделенных двоеточиями. Первый – название пункта меню, второй – набор флагов, влияющих на запуск команды, а третий – сама команда. Если флагов не указано, pdmenu запускает программу и возвращается в меню. Вывод команды на терминал не отображается, и вы увидите его только после выхода из pdmenu. Если нужно видеть этот вывод, как во втором пункте меню, где мы получаем список файлов DVD командой lsdvd, добавьте флаг display. Также можно добавить горячие клавиши для пунктов меню, поместив символ подчеркивания перед буквой, которая намечена в качестве горячей клавиши, например:
exec:_Play DVD::vlc dvd://
При нажатии горячей клавиши пункт меню не запускается, а только выделяется. Если одна горячая клавиша соответствует нескольким пунктам меню, выделение будет переходить с одного на другой. Выделение цветом работать не будет. Это происходит потому, что по умолчанию pdmenu отображает меню в стандартных цветах терминала – чтобы увидеть все цвета, нужно добавить параметр -c или --color. Другой способ это сделать – задать переменную окружения COLORTERM; при этом значение не играет роли, если переменная задана.
pdmenu -c pdmenurc
Добавляем уровни
Одним меню, выполняющим отдельные команды, возможности pdmenu не ограничиваются – также поддерживается несколько меню или подменю. В первом примере у нас было одно выражение для меню с именем main. Имя на самом деле может быть любым – при запуске pdmenu загружает первое меню в файле (это можно подавить, указав параметр при запуске, но пока мы не будем этого касаться). Попробуйте добавить второе меню следующим образом:
menu:newsubmenu:Some more stuff:This is the first submenu
exec:Some Command::/usr/bin/somecommand
nop:This does nothing
exit:Main Menu
Так мы определяем новое меню – выражение nop ничего не делает. С его помощью можно добавить строку с описанием или пустую строку, если после выражения нет текста. В первом меню мы воспользовались exit для выхода из pdmenu. В подменю exit ведет себя иначе – она выходит из данного подменю, возвращаясь в то меню, которое вызвало подменю. Добавим в меню строку для перехода в подменю:
show:Go to submenu::newsubmenu
Ее набор параметров похож на параметры exec: текстовая надпись, несколько флагов и имя подменю, в которое нужно перейти. У команды show нет флажков, поэтому оставьте это поле пустым. Небольшое предупреждение: если два меню вызывают друг друга, pdmenu промолчит, но пользователь окажется в петле: exit будет постоянно возвращать его в другое меню вместо главного меню. Избегайте таких рекурсивных схем.
Мы уже рассматривали флаг display с командой exec – он показывает в окне вывод команды. Без него вывод пишется в окно терминала, но сразу же затаптывается при перерисовке меню. Другой способ сохранить вывод команды – воспользоваться флагом pause, который переключает пользователя в окно терминала/консоли, чтобы показать вывод команды, и после нажатия клавиши возвращает его обратно в меню. Еще один полезный флаг – edit, он позволяет пользователю под вашим контролем изменять аргументы команды. Проще всего пояснить это на примере:
exec:Play another DVD:edit:/usr/bin/vlc ~Which drive?:/dev/sr0~
Флаг edit велит pdmenu изменить команду перед запуском; изменяемая часть задается в формате ~title:default~, где title – заголовок отображаемого окна, а default – значение по умолчанию (да-да!), которое пользователь может изменить до нажатия Enter. Значение по умолчанию можно оставить пустым. Флагов может быть несколько – например, edit,display.
Команды посложнее
pdmenu также может выполнять несколько команд в одном пункте меню, например, так:
group:Execute several commands
exec:::command1
exec:::command2
exec:::command3
endgroup
Подлинное хитроумие – использовать exec с параметром makemenu, который строит меню на лету. Он выполняет заданную команду почти так же, как обычно делает exec, но использует результат ее выполнения как определение меню. Например, построить меню для показа фотографий из каталога можно таким кодом:
group:Show Pics
exec:makemenu: \
echo “menu:pics:Pick a pic”; \
for f in $(ls -1 photos); do \
echo “exec:$f::display photos/$f”; \
done; \
echo exit:Go Back
show:::pics
remove:::pics
endgroup
Выполняется все, что следует за makemenu; обычно это набор команд echo, пишущих меню. Обратные слэши нужны потому, что pdmenu считает все команды однострочными, а такие плохо читаются. Все прочее – стандартный скрипт оболочки. Он записывает выражение menu, затем проходит по списку файлов, выполняя команды exec, и заканчивает командой exit. Все это объединяется в группу, которая строит меню флагом exec:makemenu, отображает его флагом show и удаляет определение menu. Команды выполняются последовательно, поэтому удаление произойдет не раньше, чем пользователь выйдет из меню с фотографиями.
Вы можете спросить: «А зачем нужна система меню, цель которой – обойтись без ввода команд, но для ее запуска приходится команды-то и вводить?» Пока мы запускали pdmenu из оболочки, но ее можно запустить вместо оболочки. Для этого нужно изменить оболочку пользователя по умолчанию; поэтому либо создайте нового пользователя для проверки, либо добавьте в одно из меню возможность запуска стандартной оболочки – нам нужен запасной выход, если что-то пойдет не так. Этот пункт меню переведет вас в оболочку, даст пользователю выполнить все необходимые команды и вернуться в меню после завершения работы оболочки клавишами Ctrl+D или путем выхода из системы.
Если запустить vipw от имени root для изменения файла паролей, последний параметр в строке с каждым пользователем – это оболочка, запускаемая при входе пользователя в систему, обычно /bin/bash. Смените ее на /usr/bin/pdmenu. Также нужно добавить /usr/bin/pdmenu в список доступных оболочек в /etc/shells, если менеджер пакетов этого не сделал. Теперь при входе в систему пользователь сразу попадет в меню, а при выходе из главного меню он выйдет из системы. Это работает как для входа в систему на локальном компьютере, так и через SSH. Не обязательно даже пользоваться Linux: PuTTY в Windows – приличный SSH-клиент, который прекрасно ладит с pdmenu. |