Como capturar mensagem de erro do comando executado?


20

Fui encarregado de criar um script automatizado de proteção de servidor e uma coisa de que eles precisam é um relatório de toda a saída de cada comando executado. Eu quero armazenar a mensagem de erro dentro de uma string e anexá-la em um arquivo de texto.

Digamos que eu executei este comando:

/sbin/modprobe -n -v hfsplus

A saída de executar isso na minha máquina seria:

FATAL: Module hfsplus not found

Como posso armazenar essa mensagem de erro dentro de uma string? Qualquer ajuda seria muito apreciada. Obrigado!


Tentei executar este comando: var = $ (/ sbin / modprobe -n -v hfsplush) E depois exibi-lo: $ var Mas ele ainda não captura a mensagem de erro dentro da string.
Miguel Roque

Respostas:


23

você pode fazer isso redirecionando o comando de erros:

/sbin/modprobe -n -v hfsplus 2> fileName 

como um script

#!/bin/bash
errormessage=$( /sbin/modprobe -n -v hfsplus 2>&1)
echo $errormessage

ou

 #!/bin/bash
errormessage=`/sbin/modprobe -n -v hfsplus 2>&1 `
echo $errormessage

Se você deseja anexar o erro, use em >>vez de>

Certifique-se de usar 2>&1e não 2> &1evitar o erro "erro de sintaxe próximo ao token inesperado` & '"


Eu tentei essa abordagem e a armazena DIRETAMENTE no arquivo de texto. Quero que ele seja armazenado dentro de uma string primeiro para que eu possa formatar o conteúdo facilmente.
Miguel Roque

11
@MiguelRoque ver atualizações
Networker

11
Tentei colocar a saída dentro de um HEREDOC e funcionou também. Muito obrigado @Networker!
Miguel Roque

11
Alguém reverteu a edição que fiz, porque tive um "erro de sintaxe próximo a &" e removi o espaço após>. Uma justificativa teria sido legal.
Pierre.Sassoulas

Tentei editar porque: Certifique-se de usar 2> & 1 e não 2> & 1 para evitar o erro "erro de sintaxe próximo ao símbolo inesperado` & '"
peter_v 28/06/18

15

Simplesmente para armazenar como uma string no script bash:

X=`/sbin/modprobe -n -v hfsplus 2>&1`
echo $X

Isso pode ser um pouco melhor, pois você verá mensagens quando o comando for executado:

TMP=$(mktemp)
/sbin/modprobe -n -v hfsplus 2>&1 | tee $TMP
OUTPUT=$(cat $TMP)
echo $OUTPUT
rm $TMP

11
Sempre use $ (command) em vez de backticks para substituição de comandos. É melhor :)
Sree

Eu sei que é melhor (tive menos problemas usando $ ()), mas por que isso?
KolonUK

4

Capto um erro como este

. ${file} 2>&1 | {
  read -d "\0" -t 0.01 error
    [ -z "$error" ] || log_warn Load completion ${file} failed: "\n${error}"
}

se a fonte falhar, capturarei o erro e o registrarei.log_warn é apenas uma função simples.

BTW, eu uso isso nos meus dotfiles



2

Versões mais recentes do bash (ie bash 4.1+):

$ msg=$(ls -la nofile 2>&1)
$ echo $msg
ls: cannot access nofile: No such file or directory
$ 

0

Para retornar a mensagem de erro em uma variável, simplesmente;

error=$(/sbin/modprobe -n -v hfsplus 2>&1 1>/dev/null)

echo $error
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.