Я делаю некоторую автоматизацию аудита, в этом примере описывается проверка версии 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