-->

UNIX — универсальная среда программирования

На нашем литературном портале можно бесплатно читать книгу UNIX — универсальная среда программирования, Керниган Брайан Уилсон-- . Жанр: ОС и Сети / Интернет. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
UNIX — универсальная среда программирования
Название: UNIX — универсальная среда программирования
Дата добавления: 16 январь 2020
Количество просмотров: 434
Читать онлайн

UNIX — универсальная среда программирования читать книгу онлайн

UNIX — универсальная среда программирования - читать бесплатно онлайн , автор Керниган Брайан Уилсон

В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями

shell.

 

Для программистов-пользователей операционной системы UNIX.

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

1 ... 63 64 65 66 67 68 69 70 71 ... 187 ВПЕРЕД
Перейти на страницу:

# overwrite: copy standard input to output after EOF

# version 2. BUG here too

PATH=/bin:/usr/bin

case $# in 1) ;;

*) echo 'Usage: overwrite file' 1>&2; exit 2

esac

new=/tmp/overwr1.$$

old=/tmp/overwr2.$$

trap 'rm -f $new $old; exit 1' 1 2 15

cat >$new # collect the input

cp $1 $old # save original file

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

cp $new $1 # overwrite the input file

rm -f $new $old

Если клавиша DEL будет нажата прежде, чем начнется работа с исходным файлом, то произойдет удаление временных файлов и файл останется один. После сохранения файла сигналы игнорируются, поэтому выполнение последней команды

cp
не прервется. Если команда
cp
начала выполняться, команда
overwrite
обязана заменить исходный файл.

Здесь есть некоторая тонкость. Рассмотрим последовательность:

$ sed 's/UNIX/UNIX(TM)g' special | overwrite special

command garbled: s/UNIX(TM)g

$ ls -l special

-rw-rw-rw- 1 you 0 Oct 1 09:02 special #$%@*!

$

Если в программе, поставляющей входной поток для команды overwrite, произойдет ошибка, то выходной поток будет пустым, и

overwrite
обязательно (с сознанием выполненного долга) уничтожит файл, заданный в качестве аргумента.

Во избежание такого финала можно предложить несколько решений. Команда

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 "[email protected]" >$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

1 ... 63 64 65 66 67 68 69 70 71 ... 187 ВПЕРЕД
Перейти на страницу:
Комментариев (0)
название