• what
who и ps -а, чтобы сообщить, кто работает в системе и что он делает;• where
PS1 служит для подобной цели.)Просмотрите каталоги /bin
/usr/bin, чтобы выяснить, как много команд являются в действительности командными файлами. Можно ли это сделать с помощью одной команды? Подсказка: посмотрите file(1). Насколько точно предположение, основанное на длине файла?3.4 Аргументы и параметры команд
Хотя команда nu
shell могут обрабатывать аргументы, так что при их запуске можно задавать имена файлов и флаги.Допустим, вы хотите создать программу с именем cx
$ cx nu
есть сокращенная запись для
$ chmod +x nu
Вы уже знаете почти все, чтобы это сделать. Вам нужен файл cx
chmod +x filename
Единственное, что требуется выяснить — как сообщить команде cx
cx оно будет иным.Если интерпретатор выполняет командный файл, то каждое вхождение $1
$2 — вторым и т.д. до $9. Поэтому если файл cx содержит строкуchmod +x $1
то при выполнении команды
$ cx nu
порожденный интерпретатор заменит "$1
nu". Рассмотрим всю последовательность операций:$ echo 'chmod +x $1' >cx
$ sh cx сх
$ echo echo Hi, there! >hello
$ hello
hello: cannot execute
$ cx hello
$ hello
Hi, there!
$ mv cx /usr/you/bin
$ rm hello
$
Заметьте, что мы задали
$ sh cx сх
в точности так, как сделал бы автоматически интерпретатор, если бы cx
$ cx сх
А как быть, если нужно работать с несколькими аргументами, например, заставить программу cx
chmod +x $1 $2 $3 $4 $5 $6 $7 $8 $9
(Это годится только для девяти аргументов, так как конструкция $10
chmod порожденным интерпретатором. Такое решение, конечно, приемлемо, но не вполне корректно и не подходит для случая с числом аргументов более девяти.С учетом упомянутой выше трудности интерпретатор предоставляет сокращенную запись $*
cx:chmod +x $*
что является эффективным при любом числе аргументов.
Используя $*
lc или m:$ cd /usr/you/bin
$ cat lc
#lc: подсчет числа строк в файлах
wc -l $*
$ cat m
#m: точный способ послать почту
mail $*
$
Обе команды можно осмысленно использовать и без аргументов. Если нет аргументов, $*
wc и mail вообще не получат никаких аргументов. С аргументами или без них команда вызывается правильно:$ lc /usr/you/bin/*
1 /usr/you/bin/cx
2 /usr/you/bin/lc
2 /usr/you/bin/m
1 /usr/you/bin/nu
2 /usr/you/bin/what
1 /usr/you/bin/where
9 total
$ ls /usr/you/bin | lc
6
$
Эти и другие команды, описываемые в настоящей главе, являются командами пользователя, т.е. вы создаете их для себя и помещаете в свой каталог /bin
shell.Аргументами командного файла не обязательно должны быть имена файлов. Рассмотрим в качестве примера поиск в каталоге, где хранится личный телефонный справочник. Если у вас есть файл с именем /usr/you/lib/phone-book
dial-a-joke 212-976-3838
dial-a-prayer 212-246-4200