Я использую bash 5.0.007-1 и net-snmp 5.8-2 на последней версии Arch Linux.
Эта строка собирает информацию о состоянии устройства:
snmpstatus -c public -v1 192.168.1.240
Если устройство не включено, т.е. указанный выше IP-адрес не существует в сети, указанная выше команда возвращает на терминал следующий вывод:
Timeout: No Response from 192.168.1.240
Как мне остановить отображение этой строки тайм-аута в терминале и вместо этого захватить ее в переменную. Также, если устройство включено и IP-адрес существует, нормальный вывод должен отображаться на терминале, а также передавать вывод в ту же переменную.
Получив переменную, я проанализирую ее и решу, что делать дальше, в зависимости от ее содержимого.
(Я прочитал довольно много информации man snmpcmd
, включая man smnpwalk
информацию о перенаправлении, но решение ускользает от меня).
решение1
Я разобрался. В целом проблема, с которой я столкнулся, была в том, что я сделал перенаправление после того, как передал вывод команды
snmpstatus -c public -v1 192.168.1.240
grep, а затем sed, в конце довольно длинной однострочной строки. В то время я не осознавал, хотя сейчас это совершенно очевидно, что перенаправление любого stderr или stdout должно происходить сразу после соответствующей команды. Это важно, потому что я фактически нашел решение и отбросил его как странным образом не работающее, потому что я пытался перенаправить в конце конвейера.
Вот как перенаправить stderr в переменную
error=$(snmpstatus -c public -v1 192.168.1.240 2>&1)
echo $error
Вот объяснение синтаксиса
0 = stdin
1 = stdout
2 = stderr
> = redirect
Поэтому 2>1 означает перенаправление stderr в stdout. & необходим, поэтому 2>&1
должен быть написан, но в моем чтении я не смог установить, почему.
Это Stackoverflowотвечатьбыло очень полезно, и такжеэта очень хорошо написанная страница о перенаправлении.