Отредактируйте stderr перед записью его в файл вместе с stdout - PullRequest
1 голос
/ 03 октября 2019

Я прошел через много SO вопросов, но пока не смог найти тот, который решает мою конкретную проблему.

Я использую дату GNU для преобразования дат в времена эпохи:

date -f created_at +%s > created_at_epoch

Чтобы отлавливать сообщения об ошибках типа «дата: недействительная дата» ... », я перенаправляю stderr на стандартный вывод:

date -f created_at +%s 2>&1 > created_at_epoch

Теперь я хотел бы изменить сообщение об ошибке на что-то вроде« NA ». Я пытался заменить процесс, но это не сработало. Порядок строк в выходных данных изменяется, и процесс не заканчивается.

date -f created_at +%s 2> >(sed s/^date.*/NA/ >&1) > created_at_epoch

Я был бы очень рад любым предложениям о том, как решить эту проблему, я не собираюсь думать об этом.

Ответы [ 2 ]

3 голосов
/ 03 октября 2019

Обычно я бы использовал метод подстановки процесса, который вы пробовали, но я бы не стал здесь, поскольку вы заботитесь о порядке вывода, и в целом нет гарантии, что stdout и stderr будут правильно смешаны. Вы не хотите полагаться на то, что они оба буферизуются и регулярно очищаются.

Было бы лучше обрабатывать каждую строку отдельно. Таким образом, вы можете точно контролировать, как плохие даты обрабатываются. В качестве бонуса вы можете полностью отключить stderr и просто отключить код выхода date.

while IFS= read -r date; do
    date -d "$date" +%s 2>/dev/null || echo "N/A"
done <created_at >created_at_epoch
2 голосов
/ 03 октября 2019

Вы можете сначала перенаправить стандартную ошибку на стандартный вывод, а затем управлять объединенным потоком:

date -f created_at +%s |& sed '/date/s/.*/NA/' > created_at_epoch

|& является сокращением Bash для 2>&1 |.

...