Читаем UNIX полностью

Во избежание такого финала можно предложить несколько решений. Команда overwrite могла бы запрашивать подтверждение перед заменой файла, но, сделав команду диалоговой, мы потеряем большую часть ее достоинств. Она могла бы проверять, что ее входной поток не пуст (с помощью test -2), но это некрасиво и к тому же неверно: выходной поток мог быть создан до обнаружения ошибки.

Наилучшее решение заключается в том, чтобы выполнять программу, поставляющую данные, под контролем команды overwrite, чтобы можно было проверить ее код завершения. Это, правда, противоречит традициям и здравому смыслу: ведь в конвейере команда overwrite обычно должна быть последней, но для правильной работы она должна идти первой. Однако overwrite ничего не выдает в стандартный выходной поток, поэтому можно считать, что не происходит потери общности. Более того, ее синтаксис не является каким-то необычным: time, nice, nohup представляют собой команды, аргументами которых служат другие команды. Ниже приведен безопасный вариант:

# overwrite: copy standard input to output after EOF

# final version


opath=$PATH

PATH=/bin:/usr/bin


case $# in

0|1) echo 'Usage: overwrite file cmd [args]' 1>&2; exit 2

esac


file=$1; shift

new=/tmp/overwr1.$$; old=/tmp/overwr2.$$

trap 'rm -f $new $old; exit 1' 1 2 15 # clean up files


if PATH=$opath "$@" >$new # collect input

then

 cp $file $old # save original file

 trap '' 1 2 15 # we are committed; ignore signals

 cp $new $file

else

 echo "overwrite: $1 failed, $file unchanged" 1>&2 exit 1

fi

rm -f $new $old

Встроенная команда интерпретатора shift сдвигает весь список аргументов на одну позицию влево: $2 становится $1, $3 становится $2 и т.д. Строка обозначает все аргументы (после shift), как и $*, но без интерпретации; мы вернемся к ее рассмотрению в разд. 5.7.

Заметьте, что значение PATH нужно восстановить перед выполнением команды пользователя; если этого не сделать, то команды, не находящиеся в /bin или /usr/bin, будут недоступны для overwrite.

Теперь команда overwrite выполняется верно (хотя и она получилась несколько громоздкой):

$ cat notice

Unix is a Trademark of Bell Laboratories

$ overwrite notice sed 's/UNIXUNIX(TM)/g' notice

command garbled: s/UNIXUNIX(TM)/g

overwrite: sed failed, notice unchanged

$ cat notice

UNIX is a Trademark of Bell Laboratories He изменился

$ overwrite notice sed 's/UNIX/UNIX(TM)/g' notice

$ cat notice

UNIX(TM) is a Trademark of Bell Laboratories

$

Типичной задачей является использование редактора sed для замены всех вхождений одного слова на другое слово. Имея под рукой команду overwrite, легко написать программу на языке shell для ее решения:

$ cat replace

# replace: replace str1 in files with str2, in place


PATH=/bin:/usr/bin


case $# in

0|1|2) echo 'Usage: replace str1 str2 files' 1>&2; exit 1

esac


left="$1"; right="$2"; shift; shift


for i do

 overwrite $i sed "s@$left@$right@g" $i

done

$ cat footnote

UNIX is not an acronym

$ replace UNIX Unix footnote

$ cat footnote

Unix is not an acronym

$

(Вспомните: если список в цикле for пуст, то по умолчанию он равен $*.) Мы использовали @ вместо / для разбиения в команде подстановки, поскольку менее вероятно, что @ вступит в конфликт с входной строкой. Команда replace устанавливает PATH равным /bin:/usr/bin, исключая $HOME/bin. Это означает, что overwrite должна находиться в /usr/bin, чтобы команда replace сработала. Мы сделали такое предположение для простоты; если вы не можете поместить overwrite в /usr/bin, вам придется добавить $HOME/bin к PATH в команде replace или явно задать полное имя overwrite. В дальнейшем будем полагать, что команды, которые мы создаем, находятся в /usr/bin, где им и следует быть.

Перейти на страницу:

Похожие книги

Полное руководство по Microsoft Windows XP
Полное руководство по Microsoft Windows XP

В книге известного американского автора описывается среда ОС Windows XP и принципы ее функционирования, приведен сравнительный анализ Windows XP с предшествующими версиями операционной системы Windows. Рассматриваются вопросы применения и модификации нового интерфейса с целью получения прямого доступа ко всем функциям Windows XP обсуждаются варианты подключения к компьютерным сетям. Несколько разделов посвящены работе с реестром и конфигурационными файлами, мультимедийным функциям и разнообразным системным службам, а также методам решения проблем с программным обеспечением и оборудованием. Особое внимание уделено обеспечению безопасности операционной системы.Издание адресовано пользователям и сетевым администраторам, желающим активно применять возможности операционной системы Windows XP (в том числе и недокументированные).

Питер Нортон , Джон Поль Мюллер

ОС и Сети, интернет / ОС и Сети / Книги по IT