Книга: UNIX — универсальная среда программирования
3.3 Создание новых команд
3.3 Создание новых команд
Теперь, как мы обещали вам в гл. 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
" каждый раз; во всяком случае эта запись длиннее и создает различия между программами, написанными, например, на Си, и программами, написанными с помощью shell
.[9] Поэтому если файл предназначен для выполнения и если он содержит текст, то интерпретатор считает, что он состоит из команд. Такие файлы называются командными. Все, что вам нужно сделать, это объявить файл nu
выполняемым, задав
$ chmod + x nu
а затем вы можете вызывать его посредством
$ nu
С этого момента те, кто используют файл nu, не смогут определить способ его создания.
Способ, с помощью которого интерпретатор на самом деле выполняет nu
, сводится к созданию нового процесса интерпретатора, как если бы вы задали
$ sh nu
Этот процесс-потомок называется порожденным интерпретатором, т.е. процессом интерпретатора, возбужденным вашим текущим интерпретатором. Но команда sh nu
— это не то же самое, что sh < nu
, поскольку в первом случае стандартный входной поток все еще связан с терминалом. Пока команда nu
выполняется только в том случае, если она находится в вашем текущем каталоге (при условии, конечно, что текущий каталог включен в PATH
, а именно это мы и предполагаем с настоящего момента). Чтобы сделать команду nu частью вашего репертуара независимо от того каталога, с которым вы работаете, занесите ее в свой собственный каталог bin
и добавьте /usr/you/bin
к списку каталогов поиска:
$ pwd /usr/you
Создать bin, если его еще не было
$ mkdir bin
$ echo $PATH
Проверить Path, чтобы убедиться
:/usr/you/bin:/bin:/usr/bin
Должно быть нечто похожее
$ mv nu bin
Установить команду nu в bin
$ ls nu
Она действительно исчезла
nu not found
из текущего каталога
$ nu
Но интерпретатор ее находит
4
$
Конечно, ваша переменная PATH
должна быть правильно определена в файле .profile
, чтобы вам не приходилось переопределять ее при каждом входе в систему.
Существуют и другие простые команды, которые вы можете адаптировать к среде по своему вкусу и создавать таким же способом. Нам показалось удобным иметь следующие команды:
• cs
для посылки подходящей последовательности специфических символов с целью очистки экрана вашего терминала (24 символа перевода строки — практически универсальное решение);
• what
для запуска who
и ps -а
, чтобы сообщить, кто работает в системе и что он делает;
• where
для вывода идентифицированного названия используемой системы UNIX. Это удобно, если вы постоянно работаете с несколькими версиями. (Установка PS1
служит для подобной цели.)
Упражнение 3.9
Просмотрите каталоги /bin
и /usr/bin
, чтобы выяснить, как много команд являются в действительности командными файлами. Можно ли это сделать с помощью одной команды? Подсказка: посмотрите file(1)
. Насколько точно предположение, основанное на длине файла?
- 3.1 Структура командной строки
- 3.2 Метасимволы
- 3.3 Создание новых команд
- 3.4 Аргументы и параметры команд
- 3.5 Результат выполнения программы в качестве аргумента
- 3.6 Переменные языка shell
- 3.7 Еще раз о переключении ввода-вывода
- 3.8 Циклы в shell-программах
- 3.9 Программа bundle: соберем все воедино
- 3.10 Для чего нужно программировать на языке shell!
- Создавай команды
- Вставка новых записей
- Создание заготовки для стратегического планирования
- HP Labs в поисках новых бизнес-решений
- 17.3.1. Изменение макета слайда, создание новых слайдов
- Инструмент командной строки gbak
- Инструмент командной строки gfix
- Создание файлов с блокировкой
- 5.4 Команда trap: обработка прерываний
- Создание свободно позиционируемых элементов
- 12. Лекция: Создание приложений с графическим интерфейсом пользователя.
- Создание объектов Collection