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

ЖАНРЫ

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

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

Шрифт:

z=$(($z+3))

# $((EXPRESSION)) -- это подстановка арифметического выражения. # Не путайте с

#+ подстановкой команд.

let z=z+3

let "z += 3" # Кавычки позволяют вставляьб пробелы и специальные операторы.

# Оператор 'let' вычисляет арифметическое выражение,

#+ это не подстановка арифметического выражения.

Все вышеприведенные примеры эквивалентны. Вы можете использовать любую из этих форм записи "по своему вкусу".

Примеры арифметических подстановок в сценариях:

1. Пример 12-6

2. Пример 10-14

3. Пример 25-1

4. Пример 25-6

5. Пример A-19

Глава 16.

Перенаправление ввода/вывода

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

С каждым открытым файлом связан дескриптор файла [ 44 ] . Дескрипторы файлов stdin, stdout и stderr -- 0, 1 и 2, соответственно. При открытии дополнительных файлов, дескрипторы с 3 по 9 остаются незанятыми. Иногда дополнительные дескрипторы могут сослужить неплохую службу, временно сохраняя в себе ссылку на stdin, stdout или stderr [ 45 ] . Это упрощает возврат дескрипторов в нормальное состояние после сложных манипуляций с перенаправлением и перестановками (см. Пример 16-1).

44

дескриптор файла -- это просто число, по которому система идентифицирует открытые файлы. Рассматривайте его как упрощенную версию указателя на файл.

45

При использрвании дескриптора с номером 5 могут возникать проблемы. Когда Bash порождает дочерний процесс, например командой exec, то дочерний процесс наследует дескриптор 5 как "открытый" (см. архив почты Чета Рамея (Chet Ramey), SUBJECT: RE: File descriptor 5 is held open) Поэтому, лучше не использовать этот дескриптор.

COMMAND_OUTPUT >

# Перенаправление stdout (вывода) в файл.

# Если файл отсутствовал, то он создется, иначе -- перезаписывается.

ls -lR > dir-tree.list

# Создает файл, содержащий список дерева каталогов.

: > filename

# Операция > усекает файл "filename" до нулевой длины.

# Если до выполнения операции файла не существовало,

# то создается новый файл с нулевой длиной (тот же эффект дает команда 'touch').

# Символ : выступает здесь в роли местозаполнителя, не выводя ничего.

> filename

# Операция > усекает файл "filename" до нулевой длины.

# Если до выполнения операции файла не существовало,

# то создается новый файл с нулевой длиной (тот же эффект дает команда 'touch').

# (тот же результат, что и выше -- ": >", но этот вариант неработоспособен

# в некоторых командных оболочках.)

COMMAND_OUTPUT >>

# Перенаправление stdout (вывода) в файл.

# Создает новый файл, если он отсутствовал, иначе --

дописывает в конец файла.

# Однострочные команды перенаправления

# (затрагивают только ту строку, в которой они встречаются):

# --------------------------------------------------------------------

1>filename

# Перенаправление вывода (stdout) в файл "filename".

1>>filename

# Перенаправление вывода (stdout) в файл "filename", файл открывается в режиме добавления.

2>filename

# Перенаправление stderr в файл "filename".

2>>filename

# Перенаправление stderr в файл "filename", файл открывается в режиме добавления.

&>filename

# Перенаправление stdout и stderr в файл "filename".

#==============================================================================

# Перенаправление stdout, только для одной строки.

LOGFILE=script.log

echo "Эта строка будет записана в файл \"$LOGFILE\"." 1>$LOGFILE

echo "Эта строка будет добавлена в конец файла \"$LOGFILE\"." 1>>$LOGFILE

echo "Эта строка тоже будет добавлена в конец файла \"$LOGFILE\"." 1>>$LOGFILE

echo "Эта строка будет выведена на экран и не попадет в файл \"$LOGFILE\"."

# После каждой строки, сделанное перенаправление автоматически "сбрасывается".

# Перенаправление stderr, только для одной строки.

ERRORFILE=script.errors

bad_command1 2>$ERRORFILE # Сообщение об ошибке запишется в $ERRORFILE.

bad_command2 2>>$ERRORFILE # Сообщение об ошибке добавится в конец $ERRORFILE.

bad_command3 # Сообщение об ошибке будет выведено на stderr,

#+ и не попадет в $ERRORFILE.

# После каждой строки, сделанное перенаправление также автоматически "сбрасывается".

#==============================================================================

2>&1

# Перенаправляется stderr на stdout.

# Сообщения об ошибках передаются туда же, куда и стандартный вывод.

i>&j

# Перенаправляется файл с дескриптором i в j.

# Вывод в файл с дескриптором i передается в файл с дескриптором j.

>&j

# Перенаправляется файл с дескриптором 1 (stdout) в файл с дескриптором j.

# Вывод на stdout передается в файл с дескриптором j.

0< FILENAME

< FILENAME

# Ввод из файла.

# Парная команде ">", часто встречается в комбинации с ней.

#

# grep search-word <filename

[j]<>filename

# Файл "filename" открывается на чтение и запись, и связывается с дескриптором "j".

# Если "filename" отсутствует, то он создается.

# Если дескриптор "j" не указан, то, по-умолчанию, бередся дескриптор 0, stdin.

#

# Как одно из применений этого -- запись в конкретную позицию в файле.

Поделиться с друзьями: