Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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