Добавление собственной информации в поток ошибок

Используйте тройник . Например:

command 2>&1 | tee file.txt

Который запускает commandперенаправление SDTERR в SDTOUT. teeкопирует STDIN как в STDOUT, так и в файл file.txt.

В bash вы можете использовать замену процесса следующим образом, чтобы скопировать вывод в$LOG:

exec &> >(tee $LOG)

Однако этот башизмне будет работать на других оболочках.

1
08.11.2019, 10:32
2 ответа
./thescript.sh 2>&1 1>/dev/null | sed '1 s/^/error_message_starts:\n/' >> error_log;

Основано на обсуждении здесь и на этом:
https://stackoverflow.com/questions/2342826/how-to-pipe-stderr-and-not-stdout

Для того, чтобы добавить все, что мы хотим. Нам нужно иметь возможность передать поток ошибок (fd2 ). Единственным выводом, который можно передать по каналу, является fd1. Поэтому fd2 нужно перенаправить на fd1. Мы также должны избавиться от fd1, чтобы он не мешал.

  • ./thescript.sh
  • 2>&1 Поток ошибок (fd2 ), идет к тому, к чему идет fd1.
  • 1>/dev/null. Fd1 просто срывается с обрыва. Теперь только журнал ошибок (fd2 ), передаются по конвейеру.
  • | sed.. Сделайте конвейер в sed, который добавляет эту вещь впереди.
  • >> журнал ошибок _Добавить поток в журнал ошибок
0
27.01.2020, 23:22

Создайте функцию журнала ошибок для ваших скриптов. Что-то вроде:

logerr () {
    printf '%s - %s - %s\n' \
    "$(date '+%F:%T')" \
    "$(basename "$0")" \
    "$*" >&2
}

Затем вы вызываете это из своих скриптов, например:

if false; then
    : something for pass
else
    logerr failed to be false
fi

Кроме того, использование 2>error_logбудет перезаписывать error_logкаждый раз. Вам нужно использовать 2>>error_logдля добавления.


Если вы хотите иметь возможность перехватывать ошибки других команд и регистрировать их, вы можете собрать что-то вроде этого:

#!/bin/bash

logerr () {
    local message=$*
    if [[ ! -t 0 ]]; then
        message=$(</dev/stdin)
    fi
    if [[ -n "$message" ]]; then
        printf '%s - %s - %s\n' \
        "$(date '+%F:%T')" \
        "$(basename "$0")" \
        "$*" >&2
    fi
}

ls -lts /fake/path 2>&1 >/dev/tty | logerr

Обеспечение перенаправления стандартного вывода в любое подходящее место, в котором он вам нужен.

Это позволит сценарию logerrчитать со стандартного ввода, если он открыт (, что позволит вам передавать программы в logerr ). Проблема в том, что программы отправляют сообщения об ошибках на stderr, а вы хотите, чтобы они оставались отдельными от stdin.

3
27.01.2020, 23:22

Теги

Похожие вопросы