Bash中'2>>((command)')重定向的含义


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 )

谁能解释那里发生了什么?

Answers:


23

>(...)称为流程替代。它使“外部”程序像文件一样写入“内部”程序。

在这种情况下,它写入stderrtee -a ${LOGFILE} >&2这将追加到LOGFILE,然后还写一切恢复stderr

重定向运算符可以沿任一方向进行进程替换,因此,如本例中所示,您可以对其进行写操作,也可以使用<(...)它来进行读取,这是一种方便的方法,例如,while无需在子shell中运行它即可进行循环本身。


5
知道了:-)如果执行echo <(date),它将给我替换文件的名称:/dev/fd/63。如果执行cat <(date),它将给我日期,即替换文件的内容:Fri Nov 18 14:11:09 NZDT 2016
NZD

@NZD,是的-但不要以为它是常规文件-您看到的/dev是进程之间管道的名称。
Toby Speight

是否使用此技术是因为无法将stderr传送到tee(在这种情况下为)?
bli

@bli是的,因为stdout已经被重定向到其他地方,在我看来这是最简单的teestderr 方式,并将其与stdout分开。
Eric Renouf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.