在Bash脚本中暂时重定向标准错误(stderr)

4

我有一个简单的脚本,用于启动另一个程序。这个其他的程序有时可能会产生SIGSEGV信号,这会干扰我的输出。因此,我添加了几行代码,用于将stderr暂时重定向到/dev/null,以忽略SIGSEGV信号。以下是我的代码草稿:

exec 2> /dev/null
progname >& ./tmp/run.txt && run_status='OK'
exec 2>1

问题在于最后一行没有达到我的要求。第一行显然起作用,重定向了 stderr。最后一行应该将 stderr 返回到之前的位置(我只是假设这与 stdout 相同)。
任何帮助都将不胜感激!

如果您不想将标准错误输出到输出文件中,为什么要使用">&"? - Paul Tomblin
程序因分段错误而停止运行,但程序本身并不输出此类信息。我不知道这是为什么,但它意味着我不关心程序的stderr(这就是我使用“>&”的原因),而是关心脚本本身的stderr。 - Karl Yngve Lervåg
即使将stderr重定向到/dev/null,信号是否仍会停止您的程序?那有何帮助呢?无论如何,难道您不应该使用exec 2>/dev/stderr将其恢复回stderr吗? - jishi
首先:感谢您对 /dev/stderr 的评论(那实际上就是我一直想要的)!第二:您是正确的,程序会停止。问题是:我不关心程序,我只关心输出。在我打开文件 'run.txt' 之前,我不想看到程序错误。 - Karl Yngve Lervåg
我敢打赌,如果你去掉那个">&",你就不必用exec来搞这些了。">&"的意思是将标准输出和标准错误重定向到文件中。如果你只使用">",标准输出会被重定向到文件中,而标准错误则会显示在屏幕上。 - Paul Tomblin
是的,但我不想让stderr输出到屏幕上。我希望将stderr输出到文件中,并且可以通过“>&”实现这一点。 - Karl Yngve Lervåg
2个回答

8

另一个选项是:

exec 3> /dev/stderr 2> /dev/null
progname >& ./tmp/run.txt && run_status='OK'
exec 2>&3

甚至可以
exec 3>&2 2> /dev/null
progname >& ./tmp/run.txt && run_status='OK'
exec 2>&3

那么脚本就会保留标准输出(stdout)和标准错误(stderr)的分离,这意味着脚本的stdout和stderr可以被单独重定向。

0
为什么不仅针对progname运行重定向它?
   progname > ./tmp/run.txt 2>/dev/null && run_status='OK'

或者可能
{
   progname > ./tmp/run.txt && run_status='OK'
} 2>/dev/null

如果是程序本身将错误消息发送到stderr,那将是一个解决方案。但事实并非如此,可能是因为当程序被SIGSEGV中断时,在能够输出错误消息之前就停止了。因此,它会被重定向到父进程。 - Karl Yngve Lervåg
我认为你不知道自己在说什么。程序要么输出到 stderr,要么不输出。不存在“重定向到父进程”的情况。 - Paul Tomblin
啊,抱歉。我不知道我在说什么,但我知道程序出现了分段错误并且没有输出到stderr。另外,“父进程”(或者我应该称之为什么)是将分段错误输出到屏幕的那个进程。 - Karl Yngve Lervåg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接