booksdaily.club
booksdaily.club » Компьютеры и Интернет » ОС и Сети » UNIX — универсальная среда программирования - Керниган Брайан Уилсон

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

На этом ресурсе Вы можете бесплатно читать книгу онлайн UNIX — универсальная среда программирования - Керниган Брайан Уилсон. Жанр: ОС и Сети / Интернет . На сайте booksdaily.club Вы можете онлайн читать полную версию книги без регистрации и sms. Так же Вы можете ознакомится с содержанием, описанием, предисловием о произведении
Перейти на страницу:

 read response

 case $response in

 y*) echo $i ;;

 q*) break

 esac

done </dev/tty

Обращение

echo -n
подавляет заключительный символ перевода строки, так что переменную
response
можно вывести на той же строке, что и приглашение. Конечно, приглашения выдаются на устройство
/dev/tty
, поскольку стандартный выходной поток, по всей вероятности, не выводится на терминал.

Оператор

break
заимствован из языка Си: он завершает выполнение самого внутреннего цикла, в нашем случае
for
, когда вводится
q
. Мы выбрали символ
q
как сигнал прекращения процесса выбора потому, что это легко сделать, потенциально удобно и не противоречит другим программам.

Интересно поэкспериментировать с пробелами в аргументах для команды

pick
:

$ pick '1 2' 3

1 2?

3?

$

Если вы хотите узнать, как команда

pick
читает свои аргументы, запустите ее и нажмите клавишу RETURN после каждого приглашения. В том виде, в каком написана эта команда, она выполняется отлично: в цикле
for i
аргументы обрабатываются правильно. Мы могли бы написать цикл другими способами:

$ grep for pick
Выясните, что делает эта версия

for i in $*

$ pick '1 2' 3

1?

2?

3?

$

Эта версия не работаете поскольку операнды в цикле снова распознаются, а наличие пробелов в первом аргументе приводит к тому, что он разбивается на два аргумента. Попробуйте взять в кавычки

$*
:

$ grep for pick
Попробуем другую версию

for i in "$*"

$ pick '1 2' 3

1 2 3?

$

Такая версия тоже не работает, поскольку "

$*
" является единым словом, которое образовано из всех аргументов, объединенных вместе с разделяющими пробелами. Но решение все-таки есть (это почти черная магия): строка трактуется особым образом интерпретатором и преобразуется в нужное число аргументов для командного файла:

$ grep for pick
Попробуем третью версию

for i in "[email protected]" '

$ pick '1 2' 3

1 2?

3?

$

Строка

[email protected]
, не взятая в кавычки, идентична
$*
; она обрабатывается иначе, только если заключена в кавычки. Мы использовали ее в команде
overwrite
, чтобы сохранить аргументы для команды пользователя.

В итоге мы можем сформулировать следующие правила:

$*
и
[email protected]
раскрываются как аргументы и снова распознаются; наличие пробелов в аргументах приводит к разбиению их на несколько аргументов;

• "

$*
" является единым словом, которое образовано из всех аргументов командного файла, объединенных вместе с пробелами;

• «

$*
» идентично аргументам, получаемым командным файлом: пробелы в аргументах игнорируются, в результате получается список слов, идентичных исходным аргументам.

Если команда

pick
не имеет аргументов, она, по-видимому, должна читать стандартный входной поток, поэтому можно задать

$ pick < mailinglist

вместо

$ pick `cat mailinglist`

Но мы не будем исследовать эту версию команды

pick
во избежание некоторых неприятных осложнений. Кроме того, значительно проще написать такую же программу на Си. С ней вы познакомитесь в следующей главе.

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

shell
.

Упражнение 5.24

Попробуйте написать программу

pick
, которая читает аргументы из стандартного входного потока, если ничего не задано в командной строке. Она должна правильно обрабатывать пробелы. Будет ли допустим ответ
q
? Если нет, то попытайтесь выполнить следующее упражнение.

Упражнение 5.25

Хотя встроенные команды интерпретатора, такие, как

read
и
set
, нельзя переключить, можно временно переключить сам интерпретатор. Прочтите в справочном руководстве раздел по
sh(1)
, в котором описывается команда
exec
, и придумайте, как читать из
/dev/tty
без вызова порожденного интерпретатора. (Может оказаться полезным сначала прочитать гл. 7.)

Упражнение 5.26

(Более простое.) Используйте команду

read
в вашем файле
.profile
для инициации
TERM
, а также всего, что зависит от нее, например позиции табуляции.

5.8 Команда

news
: служба информации пользователей

В гл. 1 упоминалось о том, что в вашей системе может быть команда

news
для передачи сообщений, представляющих интерес для всех пользователей системы. Хотя названия команды и ее детали могут различаться, большинство систем имеет службу информации. Мы рассматриваем команду
news
не для замены вашей местной команды, а чтобы показать, как легко написать такую программу на языке
shell
. Неплохо было бы сравнить реализацию предлагаемой здесь команды news с вашей версией.

Обычно основная идея таких программ заключается в том, что отдельные фрагменты новостей хранятся по одному в файлах в специальном каталоге типа

/usr/news
. Наша команда
news
сравнивает время изменения файлов в каталоге
/usr/news
и вашем исходном каталоге (
.news_time
). В целях отладки мы можем использовать каталог
'.'
как для файлов новостей, так и для
news_time
. Можно заменить его на
/usr/news
, когда программа будет готова для общего пользования:

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

Керниган Брайан Уилсон читать все книги автора по порядку

Керниган Брайан Уилсон - на сайте онлайн книг booksdaily.club Вы можете читать полные версии книг автора в одном месте.


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

Отзывы читателей о книге UNIX — универсальная среда программирования, автор: Керниган Брайан Уилсон. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор booksdaily.club


Прокомментировать
Подтвердите что вы не робот:*