Чтение онлайн

на главную - закладки

Жанры

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

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`

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

$

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

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

 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?

Поделиться:
Популярные книги

Газлайтер. Том 3

Володин Григорий
3. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 3

Новик

Ланцов Михаил Алексеевич
2. Помещик
Фантастика:
альтернативная история
6.67
рейтинг книги
Новик

Иной. Том 3. Родственные связи

Amazerak
3. Иной в голове
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Иной. Том 3. Родственные связи

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Бастард Императора. Том 14

Орлов Андрей Юрьевич
14. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 14

Двойник Короля

Скабер Артемий
1. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля

Камень. Книга 3

Минин Станислав
3. Камень
Фантастика:
фэнтези
боевая фантастика
8.58
рейтинг книги
Камень. Книга 3

Зауряд-врач

Дроздов Анатолий Федорович
1. Зауряд-врач
Фантастика:
альтернативная история
8.64
рейтинг книги
Зауряд-врач

Геном хищника. Книга пятая

Гарцевич Евгений Александрович
5. Я - Легенда!
Фантастика:
рпг
фэнтези
попаданцы
6.00
рейтинг книги
Геном хищника. Книга пятая

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

Изыскатель

Назимов Константин Геннадьевич
5. Травник
Фантастика:
фэнтези
7.00
рейтинг книги
Изыскатель

Главный рубильник. Расцвет и гибель информационных империй от радио до интернета

Ву Тим
Деловая литература:
о бизнесе популярно
5.00
рейтинг книги
Главный рубильник. Расцвет и гибель информационных империй от радио до интернета

Адепт

Листратов Валерий
4. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Адепт

Я все еще барон

Дрейк Сириус
4. Дорогой барон!
Фантастика:
боевая фантастика
5.00
рейтинг книги
Я все еще барон