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

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

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

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

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

shell.

 

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

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

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

for i in 1 2 3 4 5

В этой программе нужно контролировать процесс разбиения интерпретатором строк на аргументы, чтобы только символ перевода строки разделял соседние "слова".

Внутренняя переменная интерпретатора

IFS
(internal field separator — внутренний разделитель полей) представляет собой строку символов, которая разделяет слова в списке аргументов, находящихся в знаках слабого ударения или циклах
for
. Обычно
IFS
содержит пробелы, символы табуляции и конца строки, но мы можем заменить ее на что-либо нужное, например просто на символ перевода строки:

$ echo 'echo $#' >nargs

$ cx nargs

$ who

you tty0 Oct 1 05:59

pjw tty2 Oct 1 11:26

$ nargs 'who'

10
10 полей, разделенных пробелом и концом строки

$ IFS='

Только конец строки

$ nargs `who`

Две строки, два поля

$

После установки

IFS
равным символу перевода строки команда
zap
выполняется отлично:

$ cat zap

# zap pat: kill all processes matching pat

# final version

PATH=/bin:/usr/bin IFS='

' # just a newline

case $1 in

"") echo 'Usage: zap [-2] pattern' 1>&2; exit 1 ;;

-*) SIG=$1; shift

esac

echo ' PID TTY TIME CMD'

kill $SIG `pick `ps -ag | egrep "$*"` | awk '{print $1}`"

$ ps -ag

PID  TTY TIME CMD

...

2216   0 0:00 sleep 1000

...

$ zap sleep

PID  TTY TIME CMD

2216   0 0:00 sleep 1000? y

2314   0 0:02 egrep sleep? N

$

Мы здесь кое-что добавили: необязательный аргумент, обозначающий сигнал (обратите внимание на то, что

SIG
будет неопределенным, а значит, должен рассматриваться как пустая строка, если аргумент не задан), а также
egrep
вместо
grep
, чтобы разрешить более сложные шаблоны типа
'sleep | date'
. Первая команда
echo
выдает столбец из заголовков выходных данных команды
ps
.

Вас может заинтересовать, почему эта команда называется

zap
, а не просто
kill
. Основная причина заключается в том, что в отличие от случая с командой
cal
мы не даем действительно новой команды
kill
:
zap
по необходимости является диалоговой командой, с одной стороны, а с другой — мы хотим сохранить имя
kill
для настоящей команды. К тому же
zap
чрезвычайно медленна из-за накладных расходов на все дополнительные программы, хотя самую длинную по времени реализации команду
ps
все равно нужно выполнять. В следующей главе будет продемонстрировано более эффективное решение.

Упражнение 5.23

Измените команду

zap
так, чтобы она, выдавая заголовки из команды
ps
, была не чувствительна к изменениям в формате вывода
ps
. Насколько это усложнит программу?

5.7 Команда

pick
: пробелы или аргументы

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

pick
на языке
shell
. Единственным новым средством является механизм чтения входного потока пользователя. Встроенная команда интерпретатора
read
читает одну строку текста из стандартного входного потока и присваивает ее (без перевода строки) в качестве значения указанной переменной:

$ read greeting

hello, world
Вводим новое значение для приветствия

$ echo $greeting

hello, world

$

Самым типичным примером использования команды

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

Команда

read
может читать только из стандартного входного потока; его нельзя даже переключить. Ни одну из встроенных команд интерпретатора (в отличие от основных структур управления типа
for
) нельзя переключить с помощью операций
>
или
<
:

$ read greeting </etc/passwd

goodbye         
Тем не менее надо ввести значение

illegal io      
Сейчас shell сообщает об ошибке

$ echo $greeting
greeting получает введенное значение,

goodbye         
а не значение из файла

$

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

read
, что является основным принципом реализации команды
pick
:

# pick: select arguments

PATH=/bin:/usr/bin

for i # for each argument

do

 echo -n "$i? " >/dev/tty

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