$ echo $PATH | sed 's/^:/./> s/::/:.:/g> s/:$/:./> s/:/ /g'. /usr/you/bin /bin /usr/bin$Мы могли бы записать это с помощью четырех отдельных команд
sedsedПосле задания каталогов в компонентах
PATHtest(1)test"test -r файл""test -w файл"test -х"test -f файл"Каждая команда вырабатывает код завершения — значение, передаваемое интерпретатору и показывающее, что произошло. Это небольшое целое число, которое устанавливается по соглашению. Так, нуль может означать "истину" (команда успешно завершена), а ненулевое значение трактуется как "ложь" (выполнение команды было неудачным). Обратите внимание на то, что выбранные здесь значения противоположны значениям истины и лжи в языке Си.
Поскольку ложь может представлять множество различных значений, причина неудачи обозначается кодом завершения по лжи. Например, команда grep возвращает 0, если произошло сопоставление, 1 — если сопоставления не было, и 2 — в случае ошибки в шаблоне или именах файлов. Каждая программа возвращает код завершения, хотя обычно нас не интересует его значение. Команда
testИнтерпретатор хранит код завершения последней программы в переменной
$?$ cmp /usr/you/.profile /usr/you/.profile$ $ echo $?0 $ cmp /usr/you/.profile /usr/mary/.profile/usr/you/.profile /usr/mary/.profile differ: char 6, line 3$ echo $?1 $У некоторых команд, таких, как
cmpgrep-sifshellif командаthen команды, если условие верноelse команды, если условие ложноfiМестоположение символов перевода строк очень важно:
fithenelseОператор
ifcasetestiftestcasetestcaseif$ case "$1" inhello) commandesacвыполняется быстрее, чем
if test "$1"==hellothen commandfiЭто одна из причин, по которой в языке
shellcaseifcasetestifИтак, теперь мы готовы воспользоваться первой версией команды
which$ cat which# which cmd: which cmd in PATH is executed, version 1case $# in0) echo 'Usage: which command' 1>&2; exit 2esacfor i in `echo $PATH | sed 's/^:/.:/ s/::/:.:/g s/:$/:./ s/:/ /g'`do if test -f $i/$1 # use test -x if you can then echo $i/$1 exit 0 # found it fidoneexit 1 # not found