Перенаправление (вычисления) - Redirection (computing)

Стандартные потоки для ввода, вывода и ошибок

В вычислениях , перенаправление является одной из форм межпроцессного взаимодействия , и является функцией общей для большинства командной строки переводчиков , в том числе различных оболочек Unix , которые могут перенаправлять стандартные потоки в указанном пользователь мест.

В Unix-подобных операционных системах программы выполняют перенаправление с помощью системного вызова dup2 (2) или его менее гибких, но более высокоуровневых аналогов stdio , freopen (3) и popen (3) .

Перенаправление стандартного ввода и стандартного вывода

Перенаправление обычно осуществляется путем помещения определенных символов между командами .

Базовый

Обычно синтаксис этих символов следующий: используется <для перенаправления ввода и >для перенаправления вывода. command > file1выполняет команду command1 , помещая вывод в файл file1 , а не отображая его на терминале, который является обычным местом назначения для стандартного вывода. Это уничтожит все существующие данные в file1 .

Использование command < file1выполняет команду command1 с файлом file1 в качестве источника ввода, в отличие от клавиатуры , которая является обычным источником для стандартного ввода.

command < infile > outfileсочетает в себе две возможности: command1 читает из infile и записывает в Outfile

Варианты

Чтобы добавить вывод в конец файла, а не затирания его, >>используется оператор: command1 >> file1.

Чтобы читать из потокового литерала (встроенного файла, переданного на стандартный ввод), можно использовать здесь документ , используя <<оператор:

$ tr a-z A-Z << END_TEXT
> one two three
> uno dos tres
> END_TEXT
ONE TWO THREE
UNO DOS TRES

Чтобы читать из строки, можно использовать строку здесь , используя <<<оператор:, или: tr a-z A-Z <<< "one two three"

$ NUMBERS="one two three"
$ tr a-z A-Z <<< "$NUMBERS"
ONE TWO THREE

Трубопровод

Конвейер из трех программ, работающих на текстовом терминале

Программы можно запускать вместе, так что одна программа считывает вывод другой без необходимости в явном промежуточном файле. выполняет команду command1 , используя ее вывод в качестве входных данных для command2 (обычно называемый конвейером , при этом символ « » известен как «канал»). command1 | command2|

Две программы, выполняющие команды, могут работать параллельно, при этом единственное пространство хранения - это рабочие буферы (Linux допускает до 64 КБ для каждого буфера) плюс любое рабочее пространство, необходимое для обработки каждой команды. Например, команда «sort» не может производить какой-либо вывод, пока не будут прочитаны все входные записи, так как самая последняя полученная запись может оказаться первой в отсортированном порядке. Экспериментальная операционная система доктора Алексии Массалин, Synthesis , настраивала приоритет каждой задачи по мере ее выполнения в соответствии с заполненностью их входных и выходных буферов.

Это дает тот же конечный результат, что и при использовании двух перенаправлений и временного файла, например:

$ command1 > tempfile
$ command2 < tempfile
$ rm tempfile

Но здесь command2 не начинает выполняться до тех пор, пока command1 не завершится, и требуется достаточно большой рабочий файл для хранения промежуточных результатов, а также любого рабочего пространства, необходимого для каждой задачи. Например, хотя DOS допускает «конвейерный» синтаксис, он использует второй подход. Таким образом, предположим, что некоторая долго работающая программа «Worker» выдает различные сообщения во время работы, и что вторая программа, TimeStamp, копирует каждую запись из stdin в stdout с префиксом системной даты и времени, когда запись получена. Последовательность, такая как, будет создавать отметки времени только после того, как Worker закончит, просто показывая, насколько быстро ее выходной файл может быть прочитан и записан. Worker | TimeStamp > LogFile.txt

Хорошим примером конвейерной передачи команд является объединение echoс другой командой для достижения чего-то интерактивного в неинтерактивной оболочке, например . Это запускает ftp- клиент с входным пользователем , нажмите return , затем перейдите . echo -e 'user\npass' | ftp localhost

В случайном использовании, начальный этап трубопровода часто catили echo, чтение из файла или строки. Его часто можно заменить косвенным вводом или строкой здесь , а использование cat и piping вместо перенаправления ввода известно как бесполезное использование cat . Например, следующие команды:

$ cat infile | command
$ echo $string | command
$ echo -e 'user\npass' | ftp localhost

можно заменить на:

$ command < infile
$ command <<< $string
$ ftp localhost <<< $'user\npass'

Как echoчасто это внутренняя команда оболочки, ее использование не так критикуется, как cat, которая является внешней командой.

Перенаправление на стандартные файловые дескрипторы и обратно

В оболочках Unix, производных от исходной оболочки Bourne , первые два действия можно дополнительно изменить, поместив число ( дескриптор файла ) непосредственно перед символом ; это повлияет на то, какой поток используется для перенаправления. Стандартные потоки ввода-вывода Unix:

Ручка Имя Описание
0 стандартный ввод Стандартный ввод
1 стандартный вывод Стандартный вывод
2 stderr Стандартная ошибка

Например, выполняет команду , направляя стандартный поток ошибок в file1 . command 2> file1

В оболочках, унаследованных от csh ( оболочка C ), синтаксис вместо этого добавляет символ & (амперсанд) к символам перенаправления, таким образом достигая аналогичного результата. Причина этого заключается в том, чтобы отличить файл с именем «1» и стандартный вывод, то есть против . В первом случае stderr перенаправляется в файл с именем « 1 », а во втором - stderr перенаправляется на стандартный вывод. cat file 2>1cat file 2>&1

Еще одна полезная возможность - перенаправить один стандартный дескриптор файла на другой. Наиболее популярный вариант заключается в объединении стандартной ошибки в стандартный вывод так , сообщения об ошибках могут быть обработаны вместе с (или попеременно) обычным выходом. Например, попытается найти все файлы с именем .profile . Выполненный без перенаправления, он будет выводить попадания в стандартный вывод, а ошибки (например, из-за отсутствия прав на просмотр защищенных каталогов) в стандартный поток вывода . Если стандартный вывод направлен на файл результатов , на консоли появляются сообщения об ошибках. Чтобы увидеть в результатах файла как совпадения, так и сообщения об ошибках , объедините stderr (дескриптор 2) с stdout (дескриптор 1), используя . find / -name .profile > results 2>&12>&1

Если объединенный вывод должен быть передан в другую программу, последовательность объединения файлов 2>&1должна предшествовать символу канала, таким образом,find / -name .profile 2>&1 | less

Упрощенная, но не соответствующая POSIX форма команды (недоступна в Bourne Shell до окончательной версии 4 или в стандартной оболочке Debian Almquist, используемой в Debian / Ubuntu): или . command > file 2>&1command &>filecommand >&file

Можно использовать 2>&1до " >", но результат обычно неправильно понимается. Правило состоит в том, что любое перенаправление устанавливает дескриптор выходного потока независимо. Таким образом, " 2>&1" устанавливает дескриптор 2для любого дескриптора 1, на который указывает, обычно это stdout . Затем " >" перенаправляет дескриптор 1на что-то еще, например, в файл, но не изменяет дескриптор 2, который по-прежнему указывает на стандартный вывод .

В следующем примере, стандартный вывод записывается в файл , но ошибки перенаправляются из STDERR на стандартный вывод, т.е. послал на экран: . command 2>&1 > file

Чтобы записать в файл как ошибки, так и стандартный вывод , порядок должен быть обратным. Стандартный выход будет первым перенаправлен в файл, а затем STDERR будет дополнительно перенаправлены на стандартный вывод ручки , которая уже была изменена на точку в файле: . command > file 2>&1

Цепные трубопроводы

Токены перенаправления и конвейера можно объединить в цепочку для создания сложных команд. Например, сортирует строки infile в лексикографическом порядке, записывает уникальные строки с префиксом по количеству вхождений, сортирует результирующий вывод численно и помещает окончательный вывод в файл outfile . Этот тип конструкции очень часто используется в сценариях оболочки и пакетных файлах . sort infile | uniq -c | sort -n > outfile

Перенаправить на несколько выходов

Стандартная команда тройник может перенаправить вывод команды на несколько направлений: . Это направляет вывод списка файлов как в стандартный вывод, так и в файл xyz . ls -lrt | tee xyz

Смотрите также

внешние ссылки