AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 63705
Accepted
C. Ross
C. Ross
Asked: 2009-09-10 04:48:37 +0800 CST2009-09-10 04:48:37 +0800 CST 2009-09-10 04:48:37 +0800 CST

如何在没有管道标准输出的情况下管道标准错误

  • 772

如何在不传输标准输出流的情况下传输标准错误流?

我知道这个命令有效,但它也写出了标准。

Command 2>&1 | tee -a $LOG

我怎样才能得到标准错误?

注意:我想要的只是将 stderr 流写入日志并将 stderr 和 stdout 写入控制台。

unix
  • 4 4 个回答
  • 24343 Views

4 个回答

  • Voted
  1. Best Answer
    Kyle Brandt
    2009-09-10T04:55:38+08:002009-09-10T04:55:38+08:00

    为此,请使用一个额外的文件描述符来切换 stderr 和 stdout:

    find /var/log 3>&1 1>&2 2>&3 | tee foo.file
    

    基本上,它有效,或者至少我认为它有效,如下所示:
    重定向是从左到右评估的。

    3>&1创建一个新的文件描述符,3 是 fd 1(stdout)的副本(副本)。

    1>&2使 stdout (1) 成为 fd 2 (stderr) 的副本

    2>&3制作 fd 2,即 3 的副本(副本),之前制作了 stdout 的副本。

    所以现在 stderr 和 stdout 被切换了。

    | tee foo.filetee 复制文件描述符 1,该描述符被制作为 stderr。

    • 28
  2. Guasqueño
    2010-11-20T10:47:59+08:002010-11-20T10:47:59+08:00

    Kyle 的 Unix/Linux 命令完成了将 STDERR 与 STDOUT 切换的工作;但是解释并不完全正确。重定向运算符不进行任何复制或复制,它们只是将流重定向到不同的方向。

    通过临时将 3>&1 移到末尾来重写 Kyle 的命令,可以更容易理解这个概念:

    find /var/log  1>&2  2>&3  3>&1  
    

    虽然这样写,Linux 会显示一个错误,因为 &3 尚不存在,因为它位于 3>&1 之前。3>something 是一种声明(定义)我们将使用第三个管道的方法,因此必须在我们将水流入该管道之前对其进行定位,例如 Kyle 所写的方式。尝试这种其他方式只是为了好玩:

    ((echo "STD1";  anyerror "bbbb"; echo "STD2" ) 3>&1 4>&2 1>&4 2>&3) > newSTDOUT 2> newSTDERR
    

    没有办法复制是一种耻辱。您不能在同一命令中执行诸如“3>&1 3>&2”之类的操作,因为 Linux 只会使用找到的第一个命令并忽略第二个命令。

    我还没有(还)找到一种方法来将错误和常规输出发送到文件,并使用一个命令将错误的副本发送到标准输出。例如,我有一个 cron 作业,我希望两个输出(错误和标准)都进入日志文件,并让错误也出去,以便将电子邮件消息发送到我的 blackBerry。我可以使用“tee”使用两个命令来执行此操作,但错误在文件的常规输出行中没有以正确的顺序显示。这是我解决问题的丑陋方式:

    ((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1
    

    请注意,我必须使用 log1 两次,并且在两种情况下都必须追加,第一次使用“tee”命令的“-a”选项,第二次使用“>>”。

    做一个cat log1你会得到以下信息:

    STD1
    STD2
    -bash: sdfr: command not found
    

    请注意,错误未按应有的方式显示在第二行中。

    • 13
  3. cas
    2009-09-10T13:46:36+08:002009-09-10T13:46:36+08:00

    根据 ksh (pdksh) 的手册页,您可以这样做:

    命令 2>&1 >/dev/null | 猫-n

    即将标准错误复制到标准输出,将标准输出重定向到/dev/null,然后通过管道输入'cat -n'

    适用于我系统上的 pdksh:

    $errorecho(){ echo "$@" >&2;}
    
    $ 错误回声 foo
    富
    
    $ errorecho foo >/dev/null # 即使标准输出重定向,仍应显示
    富
    
    $ errorecho foo 2>&1 >/dev/null | 猫-n
         1个
    $   
    
    • 3
  4. martinseener
    2013-02-13T07:23:16+08:002013-02-13T07:23:16+08:00

    我让它像你想要的那样运行,因为我也需要它并完善你的命令。现在对我来说,使用 bash 3.2 在 debian 挤压上使用它可以正常工作

    (echo "foo" 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1 >> log2
    

    而 log1 记录 stdout 和 stderr,而 log2 只记录 stderr 而没有其他任何内容。

    • 1

相关问题

  • Windows 有符号链接吗?

  • 控制 UNIX 目录内容用户组所有权

  • 在命令行上从 csv 文件中过滤带有空格字符的字段

  • 如何将 VAR 从子 shell 导出到父 shell?

  • 查找文件大小(以 MB 为单位)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve