Пример 16-3. Одновременное перенаправление устройств, stdin и stdout, с помощью команды exec

Пример 16-3. Одновременное перенаправление устройств, stdin и stdout, с помощью команды exec

#!/bin/bash

# upperconv.sh

# Преобразование символов во входном файле в верхний регистр.

E_FILE_ACCESS=70

E_WRONG_ARGS=71

if [ ! -r "$1" ] # Файл доступен для чтения?

then

echo "Невозможно прочитать из заданного файла!"

echo "Порядок использования: $0 input-file output-file"

exit $E_FILE_ACCESS

fi # В случае, если входной файл ($1) не задан

#+ код завершения будет этим же.

if [ -z "$2" ]

then

echo "Необходимо задать выходной файл."

echo "Порядок использования: $0 input-file output-file"

exit $E_WRONG_ARGS

fi

exec 4<&0

exec < $1 # Назначить ввод из входного файла.

exec 7>&1

exec > $2 # Назначить вывод в выходной файл.

# Предполагается, что выходной файл доступен для записи

# (добавить проверку?).

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

cat - | tr a-z A-Z # Перевод в верхний регистр

# ^^^^^ # Чтение со stdin.

# ^^^^^^^^^^ # Запись в stdout.

# Однако, и stdin и stdout были перенаправлены.

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

exec 1>&7 7>&- # Восстановить stdout.

exec 0<&4 4<&- # Восстановить stdin.

# После восстановления, следующая строка выводится на stdout, чего и следовало ожидать.

echo "Символы из "$1" преобразованы в верхний регистр, результат записан в "$2"."

exit 0