Linux Pipe, предупреждающие сообщения, стандартный вывод
Это, вероятно, лучшее место, чтобы задать вопрос в его простейшей форме. Я пишу сценарий, который принимает вывод команды и помещает ее в переменную. После некоторой отладки я разобрался с командой, когда она выдает ошибку не на стандартный вывод, а на консоль (или стену). Смотрите пример ниже:
Когда команда выполняется успешно
root@local# apcaccess status
APC : 700
VERSION : xxxxx
BATTSTAT : AC
Когда команда выдает ошибку
root@local# apcaccess status
apcupsd @ localhost: Connection Refused.
root@local# apcaccess status | grep -i version
apcupsd @ localhost: Connection Refused.
Я заметил, когда я пытаюсь передать команду через grep 'apcaccess status | grep -i version'Я получу номер версии при успешном запуске, но в системе, в которой произошла ошибка, я получу сообщение об ошибке. Я считаю, что это не проходит через стандартный вывод.
Вопрос: как я могу заставить вывод перейти на стандартный вывод?
2 ответа
# apcaccess status 2>&1 | grep -i version
Это перенаправит stderr в stdout, поэтому grep увидит вывод.
Причина в том, что на самом деле открыты два файловых дескриптора, которые "печатают" на вашем экране. stdout (представлен дескриптором файла 1) и stderr (дескриптор файла 2). Когда вы передаете одну команду другой, вы просто берете стандартный вывод из первой команды и "передаете" его в качестве стандартного ввода второй команде. Но если первая команда напечатала что-то в stderr (обычно это сообщение об ошибке), то это не передается через канал, а выводится непосредственно на экран.
Так что вам нужно перенаправить stderr на стандартный вывод. Достигается следующее.
команда1 2>&1 | command2
Подсказки: причина, по которой амперсанд необходим, заключается в том, что вам нужно сказать, что вы перенаправляете stderr (2) в файловый дескриптор stdout (1). В противном случае без амперсанда вы просто указываете stderr перенаправить в файл с именем "1" в текущем рабочем каталоге. Аналогично тому, что вы можете сделать, когда вы выводите "выходные данные" команды (stdout) в файл через "command > myfile.log". Если для команды перенаправления не задан дескриптор файла, по умолчанию используется значение 1 (стандартный вывод).