Como capturar a mensagem de erro do comando executado?

16

Fui encarregado de criar um script de proteção de servidor automatizado e uma coisa que eles precisam é de um relatório de todas as saídas de cada comando executado. Eu quero armazenar a mensagem de erro dentro de uma seqüência de caracteres e anexá-lo 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!

    
por Miguel Roque 29.05.2014 / 09:25

6 respostas

19

você pode fazer isso redirecionando o comando errors:

/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>&1 e não 2> &1 para evitar o erro "erro de sintaxe próximo ao token inesperado" & ""

    
por 29.05.2014 / 09:42
14

Simplesmente 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
    
por 29.05.2014 / 09:47
4

Eu capturei um erro como este

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

se a fonte falhou, vou capturar o erro e registrá-lo.log_warn é apenas uma função simples.

BTW, eu uso isso em meus dotfiles

    
por 13.02.2015 / 07:22
2

Para anexar a um arquivo, use /sbin/modprobe -n -v hfsplus 2>> filename

    
por 29.05.2014 / 09:44
2

Versões mais recentes do bash (ou seja, bash 4.1 +):

$ msg=$(ls -la nofile 2>&1)
$ echo $msg
ls: cannot access nofile: No such file or directory
$ 
    
por 04.11.2017 / 11:58
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
    
por 08.02.2019 / 11:56