Главная » Программирование для UNIX » Создание новых команд

0

Настало время обратиться к теме, заявленной в главе 1, и поговорить о том, как из старых команд создавать новые.

Если   какую-то  последовательность команд  приходится  выполнять достаточно часто, то было бы удобно превратить ее в «новую» команду, имеющую собственное имя, так  чтобы ее можно было  использовать в дальнейшем как обычную команду. Чтобы быть  конкретными, предположим, что вам часто  приходится подсчитывать количество пользователей с помощью конвейера

$ who  | wc  -l

Такая возможность описывалась в главе 1, теперь же хотелось бы создать новую программу nu, которая бы это делала.

Первый шаг  заключается в создании обычного  файла, содержащего

«who   | wc   –l». Можно сделать это в любимом редакторе или  же  проявить творческий подход:

$  echo  ‘who  |  wc  -l’  >nu

(Если  бы кавычек не было, то что было бы записано в nu?)

Как  уже  упоминалось в главе 1, оболочка – это программа, подобная редактору или  командам  who и wc;  она  называется sh. А раз  это  программа, можно запустить ее и перенаправить ее ввод.  Итак, запустим оболочку, задав для нее ввод из файла nu, а не с терминала:

$ who

you           tty2        Sep  28  07:51 rhh           tty4        Sep  28  10:02 moh           tty5        Sep  28  09:38 ava           tty6        Sep  28  10:17

$ cat  nu

who  | wc  –l

$ sh  <nu

4

$

Вывод выглядит так же, как если бы команда who  | wc  –l  была введена с терминала.

Опять-таки, как и многие другие программы, оболочка забирает входные данные из файла, если он указан как аргумент; так что можно было написать

$ sh  nu

и результат не изменился бы. Но вводить каждый раз «sh» неудобно, к тому  же возникает отличие программ, написанных (например) на Си, от программ, созданных за счет соединения других программ с оболоч кой.1  Поэтому если файл является исполняемым и содержит текст, то оболочка считает, что это файл с командами оболочки. Такой файл называется командным файлом оболочки. Итак, все, что требуется – это сделать nu исполняемой один-единственный раз:

$ chmod  +x nu

и тогда впоследствии ее можно будет вызывать следующим образом:

$ nu

С этого момента пользователи nu уже  не смогут догадаться (просто  запустив программу), что она реализована таким простым способом.

Как  же оболочка на самом  деле запускает nu? Создается новый процесс оболочки, точно так же, как если бы было введено

$ sh  nu

Эта дочерняя оболочка называется подоболочкой и представляет собой процесс  оболочки,   запущенный  текущей  оболочкой.   Стандартный ввод sh  nu поступает с терминала, поэтому sh  nu – это не то же самое, что sh  <nu.

В своем  теперешнем состоянии команда nu работает, только если  она находится в текущем каталоге (если, конечно, текущий каталог присутствует в переменной PATH, что и будет предполагаться начиная с этого момента). Чтобы иметь возможность использовать nu всегда, вне зависимости от того,  в каком каталоге пользователь работает, переместите ее в личный каталог /bin и добавьте /usr/you/bin в путь поиска:

$ pwd

/usr/you

$ mkdir  bin                           Создать bin, если он не существовал ранее

$ echo $PATH                               Проверить PATH, чтобы знать наверняка

:/usr/you/bin:/bin:/usr/bin             Должно быть нечто похожее

$ mv  nu bin                           Установить nu

$ ls nu

nu not  found                        Ее действительно нет  в текущем каталоге

1        Однако такое разграничение существует в большинстве других операционных  систем.

$ nu

$

Естественно, переменная PATH должна быть правильно задана в файле

.profile, тогда  не надо будет повторять установки при каждом входе  в систему.

Есть и другие простые команды, которые можно создать таким же способом, чтобы настроить окружение по своему  вкусу.

Вот те из них, которые могут пригодиться:

•                    cs выводит собственную последовательность загадочных символов для  очистки экрана  терминала (чаще всего  реализуется  посредством вывода 24 символов новой строки);

•                    what запускает who и ps  –a, выводя сообщение о тех,  кто находится в системе, и о том, чем они занимаются;

•                    where печатает идентификационное имя системы UNIX; это удобно, если   регулярно  используется  несколько  систем.  (Установка  PS1 приводит к такому же результату.)

Упражнение 3.9.  Просмотрите /bin и /usr/bin, чтобы  узнать, сколько команд являются в  настоящее время командными файлами.  Можно ли  сделать это при  помощи одной  команды? Подсказка: file(1). Насколько верны догадки, основанные на оценке длины файла? ~

Источник: Керниган Б., Пайк Р., UNIX. Программное окружение. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 416 с., ил.

По теме:

  • Комментарии