当前位置: 首页 > 面试题库 >

Shell:将stdout重定向到/ dev / null,将stderr重定向到stdout

韦高格
2023-03-14
问题内容

我在cyberciti.biz的评论中看到了这个有趣的问题。

我发现我什至找不到在sh的单行命令中执行此操作的灵活方法。

到目前为止,我对解决方案的想法是:

tmp_file=`mktemp`
(./script 2>$tmp_file >/dev/null; cat $tmp_file) | ./other-script
rm tmp_file

但是您会看到,这不是同步的,而且致命的是,它是如此丑陋。

欢迎与您分享这个想法。:)


问题答案:

你要

./script 2>&1 1>/dev/null | ./other-script

这里的顺序很重要。假设stdin(fd 0),stdout(fd 1)和stderr(fd 2)最初都连接到tty,因此

0: /dev/tty, 1: /dev/tty, 2: /dev/tty

首先要设置的是管道。other脚本的stdin连接到管道,而script的stdout连接到管道,因此到目前为止,脚本的文件描述符如下:

0: /dev/tty, 1: pipe, 2: /dev/tty

接下来,发生重定向,从左到右。2>&1使fd 2移至fd 1当前所在的位置,即管道。

0: /dev/tty, 1: pipe, 2: pipe

最后,1>/dev/null将fd1重定向到/dev/null

0: /dev/tty, 1: /dev/null, 2: pipe

最终结果是,脚本的stdout被静默,并且其stderr通过管道发送,该管道最终在其他脚本的stdin中。

另请参见http://bash-
hackers.org/wiki/doku.php/howto/redirection_tutorial

还要注意,它1>/dev/null是的同义词,但比>/dev/null



 类似资料:
  • 问题内容: 我想将子进程的stderr输出重定向到stdout。常量应该这样做,不是吗? 然而, 确实 输出了一些东西。为什么会这样,如何在stdout上得到错误消息? 问题答案: 仔细阅读源代码即可得出答案。特别是,该文档在显示以下内容时会产生误导: 表示(…)的特殊值表示标准错误应与标准输出进入同一 句柄 。 由于在求值时stdout设置为“默认”(技术上来说),因此stderr也设置为“默认

  • 我想将stdout和stderr重定向到一个文件,同时保留输出顺序,然后还将stderr显示到屏幕上。我看到很多问题讨论它: https://unix.stackexchange.com/questions/9646/show-only-stderr-on-screen-but-write-both-stdout-and-stderr-to-file https://unix.stackexcha

  • 我有一个调用函数的PowerShell脚本。我正在努力实现所有这些,但不确定如何实现: 将标准输出写入控制台并输出。txt 将STDERR写入控制台并输出。txt和err。txt 确保所有STDOUT和STDERR输出仍按其生成的顺序 这就是我到目前为止所拥有的将STDOUT和STDERR写入文件的功能,但它不能完成我需要的其余部分。

  • 问题内容: 我想从Groovy程序中执行foo.bat,并将生成的进程的输出重定向到stdout。Java或Groovy代码示例都可以。 foo.bat可能需要花费几分钟才能运行并生成大量输出,因此我希望在生成后立即查看输出,而不是必须等到该过程完成之后才能立即查看所有输出。 问题答案: 它使用一个类读取执行的程序生成的所有输出,并将其显示在其自己的stdout中。

  • 问题内容: 我正在AIX 6上工作,在KIX Shell上运行Java命令,并且正在尝试调试类加载问题。我放了-verbose:class来打印加载的类,然后>> / home / user / log.log将控制台放到一个文件中。已创建log.log文件,但其大小为零。文件不包含任何信息,所有详细信息都在一闪而过。 问题答案: 也尝试重定向: 您的Java代码可能正在编写您的命令未重定向的信息

  • 很好的一天。我有一系列的命令,我想通过一个函数来执行,这样我就可以得到退出代码并相应地执行控制台输出。话虽如此,我这里有两个问题: 1) 我似乎无法将stderr指向/dev/null。 2) 在执行$1之前,不会显示第一条回显行。直到我运行需要一段时间才能处理的命令,比如在硬盘上搜索文件,我才真正注意到这一点。此外,情况显然是这样,因为输出如下所示: 换句话说,stderr显示在“尝试…$2”之