Журнал LinuxFormat - перейти на главную

LXF168:Команд­ная стро­ка. Pdmenu

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Новая страница: «Категория: Учебники '''pdmenu: Ме­ню обо­лоч­ки''' == Про­стой спо­соб за­пус­кать ко­ман­д…»)

Версия 20:25, 10 ноября 2018

pdmenu: Ме­ню обо­лоч­ки

Про­стой спо­соб за­пус­кать ко­ман­ды в тер­ми­на­ле

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

(thumbnail)
Наш эксперт. У Ней­ла Бот­ви­ка по ком­пь­ю­те­ру в ка­ж­дой ком­на­те, но по со­об­ра­же­ни­ям безо­пас­но­сти он ни за что не ска­жет вам, где на­хо­дит­ся цен­траль­ный сер­вер.

Тер­ми­нал – од­но из глав­ных досто­инств 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. |

Персональные инструменты
купить
подписаться
Яндекс.Метрика