Перед выполнением команды оболочка Korn выполняет поиск символов перенаправления в командной строке. Такие символы означают, что необходимо перенаправить ввод или вывод. Они могут быть заданы как перед, так и после команды. Сами символы не передаются вызываемой команде.
За исключением описанных случаев,
оболочка всегда выполняет подстановку команд и параметров в переменных
Слово и Цифра. Подстановка имени файла
выполняется только тогда, когда шаблону соответствует единственное имя, и он
не может быть интерпретирован, как пустая строка.
<Слово | Стандартный ввод связывается с файлом, заданным в параметре Слово (ему присваивается дескриптор файла, равный 0). |
>Слово | Стандартный вывод связывается с файлом, заданным в параметре Слово(файлу присваивается дескриптор, равный 1). Если файл не существует, то оболочка создает его. Если файл существует и включена опция noclobber, то будет отправлено сообщение об ошибке; если же опция выключена, то все данные из файла удаляются. |
>|Слово | Действие этой команды аналогично действию команды >Слово, однако этот оператор перенаправления подавляет опцию noclobber. |
> >Слово | Стандартный вывод связывается с файлом, заданным в параметре Слово. Если файл уже существует, то оболочка добавляет вывод к этому файлу (за символом конца файла). Если файл не существует, то оболочка создает его. |
<>Слово | Стандартный ввод связывается с файлом, заданным в параметре Слово, который открывается на чтение и запись. |
<<[-]Слово | Строки текста считываются до тех пор, пока не будет обнаружена строка, заданная в параметре Слово, или символ конца файла. Оболочка не выполняет подстановку параметров, команд и имен файлов в указанном файле. Получившийся текст, который называется документом ввода с консоли, применяется в качестве стандартного ввода. Дополнительная информация о документе ввода с консоли приведена в разделе "Ввод данных с консоли". Если строка Слово указана в кавычках, то подстановки в тексте документа выполняться не будут. |
Документ ввода с консоли рассматривается как одно слово, которое начинается с символа новой строки и заканчивается строкой, содержащей только заданный разделитель, после которого нет дополнительных пробелов. Затем начинается следующий документ ввода с консоли. Формат команды следующий:
[n]<<слово документ ввода с консоли разделитель
Если параметр слово задан в кавычках, то разделителем считается строка слово без кавычек. В строках документа ввода с консоли подстановки выполняться не будут. Если параметр слово указан без кавычек, то разделителем считается сама строка. В этом случае для всех строк документа ввода с консоли выполняется подстановка параметров, команд и чисел.
Для перенаправленных потоков данных оболочка выполняет подстановку параметров. Если символ \ , $ , ` или первый символ параметра Слово не должен интерпретироваться, как специальный, то укажите перед ним символ \.
Если вместе с << задан символ - ,
то в параметре Слово и строках вводимого документа оболочка удаляет
все начальные символы табуляции.
Если перед одной из опций перенаправления задан дескриптор файла, то вместо стандартного ввода или вывода будет применяться этот файл. В приведенном ниже примере оболочка открывает файл с дескриптором 2 на запись. Этот файл будет применяться вместо стандартного вывода (дескриптора 1):
... 2>&1
Важен порядок символов перенаправления. С каждым символом перенаправления оболочка связывает пару (Дескриптор_Файла, Файл). Например, в операторе:
... 1>Файл 2>&1
дескриптор 1 связывается с файлом, заданным в параметре Файл. Затем дескриптор файла 2 связывается с файлом, дескриптор которого равен 1 (Файл). Если изменить порядок операций перенаправления, то дескриптор файла 2 будет связан с терминалом (раньше связанным с дескриптором файла 1), а затем дескриптор файла 1 будет связан с файлом, заданным в параметре Файл.
Если за командой указан символ & , а управление заданием отключено, то по умолчанию стандартный ввод команды связывается с пустым файлом /dev/null. Если же применяется управление заданием, то среда выполнения команды содержит те дескрипторы файлов вызывающей оболочки, которые заданы в спецификациях ввода/вывода.
Дополнительная информация о перенаправлении ввода/вывода приведена в разделе "Глава 4, Перенаправление ввода и вывода"
Оболочка Korn (POSIX) позволяет запустить несколько параллельных фоновых процессов. Соответствующие команды, которые запускаются из сценария оболочки, называются параллельными процессами. Параллельные процессы применяются для обмена данными с программой.
Параллельный процесс запускается с помощью оператора |& , указанного после команды. Стандартный ввод и вывод команды перенаправляется в соответствии с конвейером, определяемым вашим сценарием.
На параллельный процесс накладываются следующие ограничения:
В следующем примере показано, как входные данные передаются параллельному процессу, и как формируется его вывод:
echo "Начальный процесс" ./FileB.sh |& read -p a b c d echo "Сообщение параллельного процесса: $a $b $c $d" print -p "Передано параллельному процессу" read -p a b c d echo "Получено от параллельного процесса: $a $b $c $d"
FileB.sh echo "Параллельный процесс запущен" read a b c d echo $a $b $c $d
В результате в стандартный вывод будет записано следующее:
Начальный процесс Сообщение от параллельного процесса: Параллельный процесс запущен Получено от параллельного процесса: Передано параллельному процессу
Команда print -p предназначена для записи данных в устройство стандартного ввода параллельного процесса. Для чтения из стандартного вывода параллельного процесса предназначена команда read -p.
Для того чтобы связать стандартный ввод и вывод параллельного процесса с файлом с заданным дескриптором, укажите операторы перенаправления ввода/вывода. Например, команда:
exec 5>&p
задает в качестве устройства ввода параллельного процесса файл с дескриптором 5.
Аналогично с помощью стандартных операторов перенаправления можно перенаправить вывод параллельного процесса. Кроме того, можно запустить еще один параллельный процесс. Оба параллельных процесса будут выводить данные в один и тот же канал, чтение из которого выполняется с помощью команды read -p. Для завершения параллельного процесса введите:
read -u5