为shell和程序分别redirectSTDERR

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

“java -version”的输出到STDERR,这很容易redirect,但我想发送shell错误(例如,当缺lessjava二进制文件时)到/ dev / null。 看起来shellredirect是一个无所谓的命题。

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

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

…它将-version命令的输出正确地发送到STDOUT,但是如果java不在那里,它也会向STDOUT发送shell“not found”错误。 我不想看到这个消息。

与以下行为相同:

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

有谁知道一种方法来限制redirect的范围,所以每个进程得到它自己的? 我并不限于ksh,但是出于环境原因,它必须是基于shell的shell。

是不是可以检查是否被发现和可执行的Java?

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

或者如果你想绕过testing并检查Java错误,也是如此

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

您可以redirect到其他描述符。 这是为bash,我认为它适用于ksh:

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