Значение «2>> (команда)» перенаправление в Bash


18

Некоторое время назад я сделал сценарий и добавил некоторые записи в журнал, но я забыл, как работает перенаправление для ведения журнала :-(

Суть этого такова:

#!/bin/bash

LOGFILE=/some/path/mylogfile

(
  # here go my commands which produce some stdout
  # and, if something goes wrong, also some stderr
) 1>>${LOGFILE} 2> >( tee -a ${LOGFILE} >&2 )

Когда я запускаю скрипт, он ничего не печатает stdout, а только печатает то, к чему идет stderr. Лог-файл ${LOGFILE}захватывает как stdout, так и stderr.

Когда я запускаю скрипт и на моем терминале нет вывода, я знаю, что все в порядке. Если есть какой-либо вывод, я знаю, что что-то пошло не так, и я могу проверить файл журнала, чтобы выяснить, в чем проблема.

Часть перенаправления, которая сейчас озадачивает меня, - это синтаксис: 2> >( some command )

Кто-нибудь может объяснить, что там происходит?

Ответы:


23

>(...)называется процессом замещения . Это позволяет "внешней" программе записывать во "внутреннюю" программу, как если бы это был файл.

В этом случае это запись, stderrк tee -a ${LOGFILE} >&2которой будет добавляться, LOGFILEа затем также записывать все обратно stderr.

Оператор перенаправления может идти в любом направлении для подстановки процесса, так что вы можете записать в него, как в этом примере, или использовать <(...)для чтения из него, что является удобным способом, например, сделать whileцикл без запуска его в подоболочке сам.


5
Понял :-) Если я исполняю echo <(date), это дает мне имя замещаемого файла: /dev/fd/63. Если я исполняю cat <(date), это дает мне дату, то есть содержание замещаемого файла: Fri Nov 18 14:11:09 NZDT 2016.
NZD

@NZD, да - но не думайте, что это обычный файл - вы видите /devназвание канала между процессами.
Тоби Спейт

Используется ли этот метод, потому что stderr не может быть передан ( teeв данном случае)?
ло

@bli Да, поскольку stdout уже перенаправлен в другое место, мне кажется, что это самый простой способ teestderr и отделить его от stdout.
Эрик Ренуф
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.