分别为 shell 和程序重定向 STDERR

分别为 shell 和程序重定向 STDERR

我正在做一些审计自动化,这个例子描述了检查 Java 的版本,尽管其他程序也做同样的事情。

“java -version”的输出转到 STDERR,这很容易重定向,但我想将 shell 错误(例如,当 java 二进制文件丢失时)发送到 /dev/null。看来 shell 重定向是一个全有或全无的命题。

我迄今为止最有希望的尝试是:

{ /bin/ksh "{java -version 2>&1;}"; } 2>/dev/null

...它正确地将 -version 命令的输出发送到 STDOUT,但如果 java 不存在,它也会将 shell“未找到”错误发送到 STDOUT。我不想看到该消息。

行为相同:

{ /bin/ksh "{java -version 2>&1;}" 2>/dev/null; }

有谁知道限制重定向范围的方法,以便每个进程都有自己的重定向吗?我并不局限于 ksh,但出于环境原因,它必须是基于 shell 的单行命令。

答案1

是否无法检查 java 是否被找到并且可以执行?

test -x "$(which java)" && java -version 2>&1

或者如果你想绕过测试并检查 java 错误

java -version 2>/dev/null 1>/dev/null && java -version 2>&1

答案2

您可以重定向到其他描述符。这是针对 bash 的,我认为它也适用于 ksh:

exec 3>javalog
java ... 2>&1 >&3
exec 3>&-

相关内容