вторник, 23 февраля 2010 г.

Расширяем возможности Linux приложений с графическим интерфейсом

Расширяем возможности Linux приложений с графическим интерфейсом

Оригинал: "Power Up Linux GUI Apps"
Автор: Jerry Peek
Дата публикации: February 8th, 2010
Перевод: Н.Ромоданов
Дата перевода: февраль 2010 г.
Запуская из командной строки приложения, имеющие графический интерфейс, вы сможете сэкономить время и расширить функциональные возможности этих программ.

Оконный интерфейс в Linux имеет массу преимуществ. Когда вы находите нужную вам программу, в ее системе меню и ее диалоговых окнах вы найдете перечисление всех ее возможностей, поэтому часто не нужно ничего другого, кроме знания интерфейса.

Однако одним большим недостатком приложений с графическим интерфейсом является то, что вы в основном ограничены только тем, что вам позволит сделать интерфейс — конечно если вы не захотите самостоятельно модефицировать сам интерфейс. Например, как можно использовать программу просмотра фотографий, чтобы просмотреть все фотографии, которые вы сохранили на диске в разных местах в прошлый понедельник? Если вы знаете, где фотографии хранятся и какие имена у файлов, вы можете пройтись по директориям с помощью файлового браузера, такого как Nautilus, щелкая по файлам для их просмотра. Но столько мороки!

У пользователей Linux больше выбора. Вы можете запускать большую часть приложений, имеющих графический интерфейс, из командной строки, указывая список аргументов (как правило, имена файлов), с которыми будете работать. Это позволит объединить возможности, имеющиеся в командной строке (завершение ввода имен файлов, спецсимволы, циклы и прочее), и возможности, которыми обладают такие утилиты как find и grep, с возможностями, которыми вы уже пользуетесь в приложениях с графическим интерфейсом. Командная строка также позволит указывать параметры, которые недоступны из меню.

Давайте начнем с пары примеров. Предположим, вы хотите использовать редактор GIMP для редактирования фотографий, сохраненных в файлах, в именах которых имеется текстовый фрагмент rome, например, rome12.jpg и elsa in rome.jpg. Запускаем GIMP следуюшим образом:

$ gimp *rome*.jpg
У вас есть фотографии Рима в некоторых из ваших 100 поддиректориев, но вы не знаете в каких из них. Вы бы хотели просмотреть их все с помощью модуля Eye редактора GNOME. Давайте найдем файлы с помощью команды find или с помощью средств самой оболочки и передадим их полные пути в модуль eog:

$ eog $(find . -name '*rome*.jpg' -print)
$ eog **/*rome*.jpg
Второй из приведенных выше примеров работает в шелл оболочке Z и в bash версии 4 с набором возможностей globstar (** является специальным символом операции рекурсии. Подробности можно узнать в статье Even Wilder Wildcards.)

Набираем команду
Первое слово в командной строке, как правило, название программы, которую хотите запустить, например, konqueror. Название может отличаться от того, что вы видите в меню рабочего стола — например, eog.

Далее вы можете добавить параметры. Каждый параметр начинается с пробела и одного или двух дефисов. Для того, чтобы узнать весь список параметров, используйте команду man, либо запустите программу с параметром —help:

$ man konqueror
No manual entry for konqueror
$ konqueror --help
Usage: konqueror ... [options] [URL]
…описание каждого параметра…
Теперь вы уже должны иметь некоторое представление о том, как набирать команду. Если это не так, то, поскольку приложение не сделает ничего опасного (например, не удалит файлы), вы можете просто поэкспериментировать. Например, хотя Konqueror сообщит, что ему нужен один URL, он воспримет несколько имен файлов (и специальные символы), файлы будут открыты во вкладках, по одному в каждой вкладке. Они обычно указываются в конце командной строки. Например, чтобы открыть все файлы с расширением .html в окне размером 800 × 600 пикселов в правом нижнем углу дисплея, наберите следующее:

$ konqueror --geometry 800x600-0-0 *.html
Когда вы запускаете приложение с графическим интерфейсом из командной строки, почти сразу должно открыться окно. Если в командной строке вы увидите символ приглашения к диалогу (например, $), то это означает, что приложение работает независимо от оболочки. Если вы не увидите такого символа, то это означает, что оболочка ждет, когда приложение закончит работу. В этом случае можно в конце команды добавить амперсанд (&), чтобы запустить процесс в фоновом режиме и получить символ приглашения к диалогу:

$ gimp [abc]*tif &
[1] 1234
$
Оболочка шелл и утилиты дают достаточную гибкость; мы здесь рассмотрели всего лишь несколько примеров. Дальнейшие идеи можно почерпнуть в колонке Power Tool сайта Linux Magazine.

Списки аргументов и циклы
Хотя во многих приложениях с графическим интерфейсом на вход можно подать много имен файлов, всему есть пределы. (Если вы в GIMP передаете 100 файлов, то он откроет 100 окон, какой ужас!). Либо можно открывать по одному файлу за один раз.

Если оболочка ждет, пока программа с графическим интерфейсом завершит свою работу, то можно запустить цикл для обработки каждого отдельного файла. Например, для того, чтобы выполнять поиск файлов HTML в текущем директории по слову error (в верхнем или нижнем регистре) , а затем открывать каждый из них в приложении Epiphany, используйте следующую последовательность команд:

$ grep -il error *.html |
> while read file
> do epiphany "$file"
> done
Здесь grep -il выдает имена файлов, в которых содержится строка, а затем имена файлов перенаправляются на вход цикла while, который запускает приложение epiphany по одному разу для каждого файла.

Хотя некоторые приложения ведут себя не так. Они порождают свои собственные экземпляры и первоначально вызванная программа прекращает работу либо становится дочерним процессом процесса init ("прародительский" процесс Linux с PID 1). В подобном случае цикл будет быстро открывать одно окно за другим для каждого файла. Вам нужно будет каким-нибудь образом делать паузы.

Например, вы хотите запустить файловый браузер nautilus по разу отдельно для каждого директория lib. В удобной утилите find имеются параеметры -ok и -okdir (последний — более надежный), которые позволят перейти в паузу и ждать подтверждения перед тем, как переходить к поиску следующего директория:

$ find . -type d -name lib -okdir nautilus '{}' ;
< nautilus ./0209_exrc/lib > ? y
…nautilus opens on 0209_exrc/lib…
< nautilus ./0210_path/lib > ?
< nautilus ./0211_perm/lib > ? y
…nautilus opens on 0211_perm/lib…
Может быть, в вашем любимом файловом браузере есть функция, подобная этой. Поэтому, чтобы поднять ставку, давайте воспользуемся еще большими возможностями, имеющимися в оболочках и утилитах. Будем просматривать каждый директорий, содержащий файлы, которые не менялись в течение года (365 дней), и запускать браузер nautilus по одному разу для каждого директория. Поскольку в некоторых директориях может быть более одного файла, отвечающего условию, мы будем использовать редактор sed, с помощью которого будем отделять имя файла в конце каждого полного пути (удаляем последний слеш и все символы, идущие за ним), и использовать команду sort -u для удаления дубликатов полных путей в выходном потоке редактора sed. Наконец, программа xargs, которой мы будем управлять с помощью аргументов, будет читать строка за строкой выходной поток команды sort (параметр -L 1 означает, что по одной строке за один раз, а параметр -d '\n' задает разделитель строк), причем каждый раз будем требовать подтверждение (параметр -p). Результат будет выглядеть следующим образом:

$ find . -type f -mtime +365 -print |
> sed 's@/[^/]*$@@' |
> sort -u |
> xargs -d 'n' -L 1 -p nautilus
nautilus . ? n
nautilus ./0209_exrc ? y
…nautilus opens on 0209_exrc…
nautilus ./0209_exrc/RCS ?
Если работа в командной строке для вас достаточно нова, этот пример, возможно, покажется вам чем-то вроде написания программы. Но как только вы узнаете больше об утилитах Linux и что они делают, вы сможете в течение приблизительно одной минуты написать такую команду и заставить ее работать. После этого вы сможете существенно экономить время (в сравнении с тем, если бы все это вы делали только в графическом интерфейсе).

Завершение ввода команды
В большинстве оболочек имеется возможность автоматически завершать набор команд, что позволяет вам набрать только часть команды или имени файла, а затем нажать клавишу TAB с тем, чтобы завершить набор команды. Конечно, во многих меню выбора файлов с графическим интерфейсом имеются подобные возможности …, но они позволяют открывать только один файл за один раз. В командной строке, вы можете использовать механизм завершения командной строки для того, чтобы построить список файлов или директорий , который затем можно будет использовать в приложении с графическим интерфейсом — возможности сопоставления файлов и директорий в командной строке значительно шире, чем те, которые я видел в программах с графическим интерфейсом.

Нравится? Пользуйтесь!
Если вы придумали удобную комбинацию команд, которую вы бы хотели использовать вновь, вспомните, что в оболочках есть алиасы, которые используются как имена для команд, и функции, в которые можно объединить вместе последовательность из нескольких команд. Некоторые команды можно также оформить в виде скриптов, которые можно запустить из меню GNOME или KDE. Возможности, действительно, безграничны.