Estoy ejecutando bash 5.0.007-1 y net-snmp 5.8-2 en un Arch Linux actualizado.
Esta línea recoge el estado de un dispositivo:
snmpstatus -c public -v1 192.168.1.240
Cuando el dispositivo no está encendido, es decir, la dirección IP anterior no existe en la red, el comando anterior devuelve el siguiente resultado al terminal:
Timeout: No Response from 192.168.1.240
¿Cómo puedo detener la visualización de esta línea de salida de tiempo de espera en la terminal y capturarla en una variable? Además, si el dispositivo está encendido y la dirección IP existe, se debe mostrar la salida normal en el terminal y pasar la salida a la misma variable.
Analizaré la variable una vez que la tenga y decidiré qué hacer dependiendo de su contenido.
(He leído bastante man snmpcmd
, incluido man smnpwalk
y sobre la redirección, pero la solución se me escapa).
Respuesta1
Me lo imaginé. En general, el problema que experimenté se debió a que hice la redirección después de haber canalizado la salida del comando.
snmpstatus -c public -v1 192.168.1.240
grep y luego sed, al final de una línea bastante larga. No me di cuenta en ese momento, aunque ahora es muy obvio, que la redirección de cualquier stderr o stdout debe ocurrir inmediatamente después del comando asociado. Esto es importante porque en realidad encontré la solución y la descarté porque extrañamente no funcionaba, porque había intentado redirigir al final de la tubería.
A continuación se explica cómo redirigir el stderr a una variable.
error=$(snmpstatus -c public -v1 192.168.1.240 2>&1)
echo $error
Aquí hay una explicación de la sintaxis.
0 = stdin
1 = stdout
2 = stderr
> = redirect
Por lo tanto, 2>1 significa redirigir stderr a stdout. El & es esencial por lo tanto 2>&1
debe escribirse, pero en mi lectura no pude establecer por qué.
Este desbordamiento de pilarespuestafue muy útil, y también lo fueesta página muy bien escrita sobre redirección.