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 / 问题 / 526592
Accepted
Robert
Robert
Asked: 2013-07-27 09:17:18 +0800 CST2013-07-27 09:17:18 +0800 CST 2013-07-27 09:17:18 +0800 CST

管道 stderr 和 stdout 到不同的命令(不仅仅是文件)

  • 772

我正在为 ldap 制作备份脚本。我希望错误转到 /var/log 中的一个文件,并将输出转到备份文件夹中的另一个文件。目前我正在重定向到一个临时文件,然后将临时文件发送到日志。不过,我宁愿将其作为 1 班轮来执行...

/usr/bin/ldapsearch -x -LLL -b "dc=contoso,dc=com" "(objectclass=*)" -h ldap.server -v 2>>/tmp/ldaptmp.err |
  gzip -c > /mnt/backups/ldap/`date +\%Y\%m\%d`.ldif.gz || 
  logger -t ldapbackup -p local6.err error exit $?

cat /tmp/ldaptmp.err | grep -v "ldap_initialize( ldap://ldap.server )" | 
  grep -v "filter: (objectclass=\*)" |
  grep -v "requesting: All userApplication attributes" >$ERR_LOG
rm -f /tmp/ldaptmp.err

关于如何将 stderr 和 stdout 重定向到不同的管道以将此命令压缩为 1 行的任何想法?或者,还有更好的方法?

linux
  • 3 3 个回答
  • 7701 Views

3 个回答

  • Voted
  1. Dennis Williamson
    2013-07-27T16:25:51+08:002013-07-27T16:25:51+08:00

    在 Bash 中,您可以使用进程替换来为您管理额外的文件描述符。您可能会发现这比文件描述符交换方法看起来更简洁。

    command > >(process_stdout) 2> >(process_stderr)
    

    您的命令可能如下所示:

    /usr/bin/ldapsearch -x -LLL -b "dc=contoso,dc=com" "(objectclass=*)" -h ldap.server -v \
      > >( \
        gzip -c > /mnt/backups/ldap/$(date '+%Y%m%d').ldif.gz || 
        logger -t ldapbackup -p local6.err error exit $?
      ) \
      2> >( \
        grep -Ev "ldap_initialize( ldap://ldap.server )|filter: (objectclass=\*)|requesting: All userApplication attributes" > "$err_log" \
      )
    
    • 26
  2. Best Answer
    Deer Hunter
    2013-07-27T11:36:23+08:002013-07-27T11:36:23+08:00

    正如Unix SE的这个答案所示:

    MyWeirdCommand.sh

    #!/bin/bash
    echo "1 2   3"
    echo "4 5   6" >&2
    

    测试重定向.sh:

    #!/bin/bash
    (./MyWeirdCommand.sh | cut -f1 >stdout.log) 3>&1 1>&2 2>&3 | cut -f3 >stderr.log
    

    运行产量:

    • stderr.log 6

    • stdout.log 1

    • 11
  3. Internal Server Error
    2015-05-12T04:25:51+08:002015-05-12T04:25:51+08:00

    这就是我打印 stdout 和 stderr 以分隔带有时间戳的文件的方式(从 Debian moreutils 包管道到 ts ):

    (./my_little_script.pl | ts %F\ %T > out.log) 2>&1 | ts > err.log
    

    PS如果你没有ts,请创建自己的别名:

    alias ts='while IFS= read -r line; do printf "%s %s\n" "$(date +%F\ %T)" "$line"; done'
    
    • 2

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

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

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

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

    • 9 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

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

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +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