怎么发球去stderr?

dje*_*lin 34 bash stderr tee

我想拆分,stdout以便打印到stdoutstderr.这听起来像是一份工作,tee但语法却在逃避我 -

./script.sh | tee stderr
Run Code Online (Sandbox Code Playgroud)

当然,stderr这里应该如何引用?

bri*_*gge 50

我发现唯一可以在交互式和非交互式shell中工作的跨平台方法是:

command | tee >(cat 1>&2)
Run Code Online (Sandbox Code Playgroud)

tee的参数是文件或文件句柄.使用进程替换,我们将输出发送到进程.在process = cat =中,我们将stdout重定向到stderr.shell(bash/ksh)负责设置1和2文件描述符.

  • 如果在脚本中运行,请确保添加“#!/bin/bash”。因为 `sh` 不支持 `>( xxxx )` (2认同)

Nic*_*son 36

./script.sh | tee /dev/fd/2
Run Code Online (Sandbox Code Playgroud)

请注意,这取决于操作系统支持,而不是tee中的任何内置电源,因此不是通用的(但可以在MacOS,Linux,Solaris,FreeBSD,可能还有其他工作).

  • 请注意,它可能会失败,具体取决于`/ dev/fd/2`究竟是什么.例如,如果以"root"身份登录,则终端由`root`拥有.然后,如果您切换用户,您将无权访问`/ dev/fd/2`. (3认同)
  • @chepner这很有意思.但是,在这个例子中,文件名不会被`bash`解释,因此这里不会发挥作用. (2认同)