Перенаправить 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>&-