为什么即使我将 Bash 脚本重定向到 stderr,它仍然输出到 stdout?

为什么即使我将 Bash 脚本重定向到 stderr,它仍然输出到 stdout?

我有一个 Bash 脚本:

#!/bin/bash
echo this should be visible only in the stderr output but it is not 1>&2
exit 0

另外,我有一个启动此脚本的自定义应用程序。该应用程序捕获标准输出和标准错误。标准输出为空,标准错误包含提供的文本。到目前为止,一切都很好。但是当我从控制台(物理终端)启动脚本时:

./my_script.sh

我希望它不会在显示屏上打印任何内容,但它会打印。我尝试了各种重定向组合,例如,,>&2等等>/dev/stderr,但结果是相同的。我还尝试将 stdout 重定向到 null 1>&2 >/dev/null,但显然它也将我的文本发送到 null 。

这是在哪里配置的?如何使我的终端不显示 stderr?

答案1

要阻止脚本将其标准错误流发送到终端,您需要将其重定向到/dev/null文件。

您可以通过调用带有在命令行上重定向的标准错误流的脚本或让脚本本身重定向其错误流来执行此操作。

要将错误流重定向到/dev/null命令行,请使用以下命令调用脚本

./my_script 2>/dev/null

如果您希望脚本自动丢弃其标准错误流,请将流重定向到/dev/null脚本内:

#!/bin/bash

# Discard any diagnostic output, errors, and interactive prompts.
exec 2>/dev/null

echo 'This should not be visible.' >&2
echo 'This should be visible.'

更改/dev/null为文件的路径名以将诊断输出传递到该文件。

标准输出流不受标准错误流重定向到/dev/null文件或重定向到文件的影响。

请注意,脚本通常不应由 终止exit 0

答案2

要使这一特定脚本丢弃其标准输出:

给定一个脚本:

date
date -r /var/empty/foo

编辑它成为群组命令。以这种方式将命令分组在一起允许处理组合命令的标准输出和标准错误流(重定向、管道传输、丢弃等),就好像该组在逻辑上是单个命令一样。

例如:

{
date
date -r /var/empty/foo
} > /dev/null

将丢弃标准输出,但不会改变标准错误流的路由。

以下脚本:

{
date
date -r /var/empty/foo
} > /dev/null 2>&1

将其标准输出重定向到 /dev/null,然后将其标准错误重定向到其标准输出,从而丢弃 stderr 和 stdout。该特定语法相当于:

{
date
date -r /var/empty/foo
} > /dev/null 2>/dev/null

相关内容