Перенаправить STDERR отдельно для оболочки и программы

Я делаю некоторую автоматизацию аудита, этот пример описывает проверку версии Java, хотя другие программы делают то же самое.

Вывод "java -version" идет в STDERR, который легко перенаправляется, но я хочу отправить ошибки оболочки (например, когда отсутствует двоичный файл java) в /dev/null. Похоже, что перенаправление оболочки является предложением "все или ничего".

Моя самая многообещающая попытка до сих пор:

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

... который правильно отправляет вывод команды -version в STDOUT, но если java отсутствует, он также отправляет ошибку оболочки "not found" в STDOUT. Я не хочу видеть это сообщение.

То же поведение с:

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

Кто-нибудь знает способ ограничить область перенаправления, чтобы каждый процесс получил свой собственный? Я не ограничиваюсь ksh, но по соображениям окружающей среды это должен быть однострочник на основе оболочки.

2 ответа

Решение

Разве невозможно проверить, найден ли Java и выполняется ли он?

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

или если вы хотите обойти тест и проверить на наличие ошибок Java, тоже

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

Вы можете перенаправить на дополнительные дескрипторы. Это для bash, я думаю, что это работает и для ksh:

exec 3>javalog
java ... 2>&1 >&3
exec 3>&-
Другие вопросы по тегам