Acessa o erro padrão no outro lado do ||?

2

Eu quero fazer algo como:

command || log $error_from_last_command

Existe uma maneira de usar || e ainda acessar stderr como um pipe?

Minha intenção aqui é processar a mensagem de erro de command , usando log , mas somente se command falhar. Estou lendo a duplicata marcada, mas não vejo como aplicar isso à minha situação.

    
por Philip Kirkbride 22.01.2018 / 16:09

2 respostas

3

Se você quiser usar a saída de um programa em outro que só é executado após o primeiro comando concluído, provavelmente é mais fácil armazenar a saída em um arquivo.

errfile=$(mktemp)
if ! somecommand 2> "$errfile" ; then
    log < "$errfile"    # or  log "$(cat "$errfile")" ?
fi
rm "$errfile"

Pipetar a saída exigiria que os comandos sejam executados ao mesmo tempo, mas só obtemos o código de saída quando o primeiro comando é concluído.

log < "$errfile" acima, é claro, direcionaria a mensagem de erro para stdin de log (como se fosse um pipe). Para obtê-lo como um argumento de linha de comando, use log "$(cat "$errfile")" (um argumento) ou log $(cat "$errfile") (com divisão de palavras, log vê vários argumentos) ou log "$(< "$errfile")" (não padrão, funciona pelo menos no Bash) .

    
por 22.01.2018 / 16:40
0

Se for suficiente para seus objetivos conhecer o código de saída do primeiro elemento do canal (ou qualquer elemento de qualquer canal), você pode se beneficiar do bash variable PIPESTATUS , que de acordo com a página bash man é: "Uma variável de matriz ... contendo uma lista de valores de status de saída dos processos no pipeline de primeiro plano executado mais recentemente ...".

Eu percebo que tecnicamente você está pedindo algo um pouco diferente, mas você pode considerar se o uso dessa variável pode atender a sua necessidade de uma maneira que você originalmente não previa.

    
por 22.01.2018 / 17:18

Tags