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

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

Жанры

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

Не раз предпринимались попытки систематизировать коды завершения (см. /usr/include/sysexits.h), но эта систематизация предназначена для программистов, пишущих на языках C и C++. Автор документа предлагает ограничить коды завершения, определяемые пользователем, диапазоном 64 - 113 (и, само собой разумеется -- 0, для обозначения успешного завершения), в соответствии со стандартом C/C++. Это сделало бы поиск ошибок более простым.

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

в Пример 9-2.

Обращение к переменной $?, из командной строки, после завершения работы сценария, дает результат, в соответствии с таблицей, приведенной выше, но только для Bash или sh. Под управлением csh или tcsh значения могут в некоторых случаях отличаться.

Приложение D. Подробное введение в операции ввода-вывода и перенаправление ввода-вывода

написано Stephane Chazelas и дополнено автором документа

Практически любая команда предполагает доступность 3-х файловых дескрипторов. Первый -- 0 (стандвртный ввод, stdin), доступный для чтения. И два других -- 1 (stdout) и 2 (stderr), доступные для записи.

Запись, типа ls 2>&1, означает временное перенаправление вывода, с устройства stderr на устройство stdout.

В соответствии с соглашениями, команды принимают ввод из файла с дескриптором 0 (stdin), выводят результат работы в файл с дескриптором 1 (stdout), а сообщения об ошибках -- в файл с дескриптором 2 (stderr). Если какой либо из этих трех дескрипторов окажется закрытым, то могут возникнуть определенные проблемы:

bash$ cat /etc/passwd >&-

cat: standard output: Bad file descriptor

К примеру, когда пользователь запускает xterm, то он сначала выполняет процедуру инициализации, а затем, перед запуском командной оболочки, xterm трижды открывает терминальные устройства (/dev/pts/<n>, или нечто подобное).

После этого, командная оболочка наследует эти три дескриптора, и любая команда, запускаемая в этой оболочке, так же наследует их. Термин перенаправление -- означает переназначение одного файлового дескриптора на другой (канал (конвейер) или что-то другое). Переназначение может быть выполнено локально (для отдельной команды, для группы команд, для подоболочки, для операторов while, if, case, for...) или глобально (с помощью exec).

ls > /dev/null– - означает запуск команды ls с файловым дескриптором 1, присоединенным к устройству /dev/null.

bash$ lsof -a -p $$ -d0,1,2

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

bash 363 bozo 0u CHR 136,1 3 /dev/pts/1

bash 363 bozo 1u CHR 136,1 3 /dev/pts/1

bash 363 bozo 2u CHR 136,1 3 /dev/pts/1

bash$ exec 2> /dev/null

bash$ lsof -a -p $$ -d0,1,2

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

bash 371 bozo 0u CHR 136,1 3 /dev/pts/1

bash 371 bozo 1u CHR 136,1 3 /dev/pts/1

bash 371 bozo 2w CHR 1,3 120 /dev/null

bash$ bash -c 'lsof -a -p $$ -d0,1,2' | cat

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

lsof 379 root 0u CHR 136,1 3 /dev/pts/1

lsof 379 root 1w FIFO 0,0 7118 pipe

lsof 379 root 2u CHR 136,1 3 /dev/pts/1

bash$ echo "$(bash -c 'lsof -a -p $$ -d0,1,2' 2>&1)"

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

lsof 426 root 0u CHR 136,1 3 /dev/pts/1

lsof 426 root 1w FIFO 0,0 7520 pipe

lsof 426 root 2w FIFO 0,0 7520 pipe

Упражнение:

Проанализируйте следующий сценарий.

#! /usr/bin/env bash

mkfifo /tmp/fifo1 /tmp/fifo2

while read a; do echo "FIFO1: $a"; done < /tmp/fifo1 &

exec 7> /tmp/fifo1

exec 8> >(while read a; do echo "FD8: $a, to fd7"; done >&7)

exec 3>&1

(

(

(

while read a; do echo "FIFO2: $a"; done < /tmp/fifo2 | tee /dev/stderr | tee /dev/fd/4 | tee /dev/fd/5 | tee /dev/fd/6 >&7 &

exec 3> /tmp/fifo2

echo 1st, to stdout

sleep 1

echo 2nd, to stderr >&2

sleep 1

echo 3rd, to fd 3 >&3

sleep 1

echo 4th, to fd 4 >&4

sleep 1

echo 5th, to fd 5 >&5

sleep 1

echo 6th, through a pipe | sed 's/.*/PIPE: &, to fd 5/' >&5

sleep 1

echo 7th, to fd 6 >&6

sleep 1

echo 8th, to fd 7 >&7

sleep 1

echo 9th, to fd 8 >&8

) 4>&1 >&3 3>&- | while read a; do echo "FD4: $a"; done 1>&3 5>&- 6>&-

) 5>&1 >&3 | while read a; do echo "FD5: $a"; done 1>&3 6>&-

) 6>&1 >&3 | while read a; do echo "FD6: $a"; done 3>&-

rm -f /tmp/fifo1 /tmp/fifo2

# Выясните, куда переназначены файловые дескрипторы каждой команды и подоболочки.

exit 0

Приложение E. Локализация

Возможность локализации сценариев Bash нигде в документации не описана.

Локализованные сценарии выводят текст на том языке, который используется системой, в соответствии с настройками. Пользователь Linux, живущий в Берлине (Германия), будет видеть сообщения на немецком языке, в то время как другой пользователь, проживающий в Берлине штата Мэриленд (США) -- на английском.

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

Отморозок 3

Поповский Андрей Владимирович
3. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 3

Род Корневых будет жить!

Кун Антон
1. Тайны рода
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Род Корневых будет жить!

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Полковник Империи

Ланцов Михаил Алексеевич
3. Безумный Макс
Фантастика:
альтернативная история
6.58
рейтинг книги
Полковник Империи

Идеальный мир для Лекаря 11

Сапфир Олег
11. Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 11

Последняя Арена 2

Греков Сергей
2. Последняя Арена
Фантастика:
рпг
постапокалипсис
6.00
рейтинг книги
Последняя Арена 2

Скрываясь в тени

Мазуров Дмитрий
2. Теневой путь
Фантастика:
боевая фантастика
7.84
рейтинг книги
Скрываясь в тени

Герцог и я

Куин Джулия
1. Бриджертоны
Любовные романы:
исторические любовные романы
8.92
рейтинг книги
Герцог и я

Владеющий

Злобин Михаил
2. Пророк Дьявола
Фантастика:
фэнтези
8.50
рейтинг книги
Владеющий

Развод с миллиардером

Вильде Арина
1. Золушка и миллиардер
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Развод с миллиардером

Паладин из прошлого тысячелетия

Еслер Андрей
1. Соприкосновение миров
Фантастика:
боевая фантастика
попаданцы
6.25
рейтинг книги
Паладин из прошлого тысячелетия

Боги, пиво и дурак. Том 6

Горина Юлия Николаевна
6. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 6

Бестужев. Служба Государевой Безопасности. Книга вторая

Измайлов Сергей
2. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга вторая

Орден Багровой бури. Книга 6

Ермоленков Алексей
6. Орден Багровой бури
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Орден Багровой бури. Книга 6