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

NZD*_*NZD 23 bash io-redirection shell-script

不久前我制作了一个脚本,并在它周围添加了一些日志记录,但我忘记了日志记录的重定向是如何工作的:-(

它的要点是:

#!/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 )
Run Code Online (Sandbox Code Playgroud)

当我运行脚本时,它不会向 打印任何内容stdout,而只会打印到stderr. 日志文件同时${LOGFILE}捕获标准输出和标准错误。

当我运行脚本并且我的终端上没有输出时,我知道一切都很好。如果有任何输出,我知道出了什么问题,我可以检查日志文件以找出问题所在。

现在让我困惑的重定向部分是以下语法: 2> >( some command )

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

Eri*_*ouf 29

>(...)称为进程替换。它让“外部”程序像文件一样写入“内部”程序。

在这种情况下,它写入stderrtee -a ${LOGFILE} >&2内容将附加到 .LOGFILE然后还将所有内容写回stderr.

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

  • 明白了 :-) 如果我执行 `echo &lt;(date)`,它会给我替换文件的名称:`/dev/fd/63`。如果我执行`cat &lt;(date)`,它会给我日期,即替换文件的内容:`Fri Nov 18 14:11:09 NZDT 2016`。 (6认同)