Redireciona STDERR separadamente para o shell e o programa

2

Estou fazendo alguma automação de auditoria, este exemplo descreve a verificação da versão do Java, mesmo que outros programas façam a mesma coisa.

A saída de "java -version" vai para STDERR, que é facilmente redirecionada, mas eu quero enviar erros de shell (por exemplo, quando o binário java está faltando) para / dev / null. Parece que o redirecionamento de shell é uma proposta de tudo ou nada.

Minha tentativa mais promissora até agora:

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

... que envia corretamente a saída do comando -version para STDOUT, mas se o java não estiver lá, ele também enviará o erro "not found" do shell para o STDOUT. Eu não quero ver essa mensagem.

O mesmo comportamento com:

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

Alguém sabe uma maneira de limitar o escopo do redirecionamento para que cada processo receba o seu próprio? Eu não estou limitado a ksh, mas por razões de ambiente tem que ser um one-liner baseado em shell.

    
por GraduateOfAcmeU 13.06.2012 / 18:19

2 respostas

1

Não é possível verificar se o java é encontrado e executável?

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

ou se você quiser testar e verificar erros de java, também

java -version 2>/dev/null 1>/dev/null && java -version 2>&1
    
por 13.06.2012 / 18:39
1

Você pode redirecionar para descritores adicionais. Isso é para o bash, acho que funciona para o ksh também:

exec 3>javalog
java ... 2>&1 >&3
exec 3>&-
    
por 13.06.2012 / 19:34