Jump to content

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

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

В вычислительной технике перенаправление это форма межпроцессного взаимодействия и функция, общая для большинства интерпретаторов командной строки , включая различные оболочки Unix , которые могут перенаправлять стандартные потоки в указанные пользователем места. Концепция перенаправления довольно старая и восходит к самым ранним операционным системам (ОС). [ нужна ссылка ] Обсуждение целей проектирования перенаправления можно найти уже в описании ввода-вывода подсистемы ОС Multics 1971 года . [1] Однако до появления ОС UNIX с ее « каналами » перенаправление в операционных системах было сложно или даже невозможно осуществить. [2]

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

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

[ редактировать ]

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

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

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

command < infile > outfile сочетает в себе две возможности: команда читает из infile и пишет в исходный файл

Варианты

[ редактировать ]

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

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

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

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

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

Трубопроводы

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

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

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

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

$ command1 > tempfile
$ command2 < tempfile
$ rm tempfile

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

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

При повседневном использовании начальный этап конвейера часто cat или echo, чтение из файла или строки. Это часто можно заменить косвенным вводом или строкой here , а использование cat и конвейеров вместо перенаправления ввода известно как бесполезное использование 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 , первые два действия можно дополнительно изменить, поместив число ( дескриптор файла ) непосредственно перед символом ; это повлияет на то, какой поток будет использоваться для перенаправления. [5] Стандартные потоки ввода-вывода Unix: [6]

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

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

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

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

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

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

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

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

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

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

[ редактировать ]

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

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

[ редактировать ]

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

См. также

[ редактировать ]
  1. ^ Холидей и Органик 1972 .
  2. ^ Керниган и Морган 1982 , с. 780, Перенаправление ввода/вывода.
  3. ^ Справочное руководство библиотеки GNU C для версии 2.38 gnu.org.
  4. ^ «KHB: Синтез: эффективная реализация фундаментальных сервисов операционных систем» . lwn.net .
  5. ^ Нодзаки, Роберто (21 апреля 2022 г.). «Как перенаправить вывод команды оболочки» . www.redhat.com .
  6. ^ «Перенаправления (Справочное руководство Bash)» . www.gnu.org .
  7. ^ «Конвейерная обработка и перенаправление вывода в терминале Linux» . Linux.org .

Источники

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: cf8c80d35cbb2d674c99031850180ce2__1714066320
URL1:https://arc.ask3.ru/arc/aa/cf/e2/cf8c80d35cbb2d674c99031850180ce2.html
Заголовок, (Title) документа по адресу, URL1:
Redirection (computing) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)