Рассмотрите команду
$ echo */*
Может ли она вывести все имена всех каталогов? В каком порядке появятся эти имена?
(
/ в локальное имя файла (т.е. символ /, который не является разделителем компонентов в абсолютном имени)?Что произойдет в случае ввода команд $ cat x y >y
$ cat x >>xПодумайте, прежде чем броситься их выполнять.
Если вы введете
$ rm *
почему команда rm
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
$ mkdir bin
$ echo $PATH
:/usr/you/bin:/bin:/usr/bin
$ mv nu bin
$ ls nu
nu not found
из текущего каталога
$ nu
4
$
Конечно, ваша переменная PATH
.profile, чтобы вам не приходилось переопределять ее при каждом входе в систему.Существуют и другие простые команды, которые вы можете адаптировать к среде по своему вкусу и создавать таким же способом. Нам показалось удобным иметь следующие команды:
• cs