¿Cómo capturar un mensaje de error del comando ejecutado?

20

Se me asignó la tarea de crear un script de refuerzo de servidor automatizado y una cosa que necesitan es un informe de todos los resultados de cada comando ejecutado. Quiero almacenar el mensaje de error dentro de una cadena y agregarlo en un archivo de texto.

Digamos que ejecuté este comando:

/sbin/modprobe -n -v hfsplus

El resultado de ejecutar esto en mi máquina sería:

FATAL: Module hfsplus not found

¿Cómo puedo almacenar ese mensaje de error dentro de una cadena? Cualquier ayuda sería muy apreciada. ¡Gracias!

Miguel Roque
fuente
Intenté ejecutar este comando: var = $ (/ sbin / modprobe -n -v hfsplush) Y luego mostrarlo: $ var Pero todavía no captura el mensaje de error dentro de la cadena.
Miguel Roque

Respuestas:

23

puedes hacerlo redirigiendo el comando de errores:

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

como un guión

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

o

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

si desea agregar el error, use en >>lugar de>

Asegúrese de usar 2>&1y no 2> &1evitar el error "error de sintaxis cerca del token inesperado` & '"

Networker
fuente
He intentado ese enfoque y lo almacena DIRECTAMENTE en el archivo de texto. Quiero que se almacene dentro de una cadena primero para poder formatear el contenido fácilmente.
Miguel Roque
1
@MiguelRoque ver actualizaciones
Networker
1
Intenté poner la salida dentro de un HEREDOC y funcionó también. Muchas gracias @Networker!
Miguel Roque
1
Alguien revirtió la edición que hice, porque tuve un "error de sintaxis cerca de &" y eliminé el espacio después de>. Una justificación hubiera sido agradable.
Pierre.Sassoulas
Intenté editar porque: asegúrese de usar 2> & 1 y no 2> & 1 para evitar el error "error de sintaxis cerca del token inesperado` & '"
peter_v
15

Simplemente para almacenar como una cadena en script bash:

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

Esto puede ser un poco mejor ya que verá mensajes cuando se ejecute el comando:

TMP=$(mktemp)
/sbin/modprobe -n -v hfsplus 2>&1 | tee $TMP
OUTPUT=$(cat $TMP)
echo $OUTPUT
rm $TMP
grafito
fuente
1
Utilice siempre $ (comando) en lugar de teclas de retroceso para la sustitución de comandos. Es mejor :)
Sree
Sé que es mejor (he tenido menos problemas con $ ()), pero ¿por qué?
KolonUK
4

Capturo un error como este

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

si la fuente falla, capturaré el error y lo registraré. log_warn es solo una función simple.

Por cierto, uso esto en mis archivos de puntos

Wener
fuente
2

Para adjuntar a un archivo use /sbin/modprobe -n -v hfsplus 2>> filename

harish.venkat
fuente
2

Nuevas versiones de bash (es decir, bash 4.1+):

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

Para devolver el mensaje de error en una variable, simplemente;

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

echo $error
Jonathan
fuente