перенаправление stderr в функцию err

#bash #bash-trap

#bash #bash-ловушка

Вопрос:

Я хочу перехватывать ошибки с помощью моей функции err, которая записывает данные в stderr. Но в этом примере я получаю две строки ошибок. Как я могу удалить первое сообщение об ошибке, не сгенерированное моей функцией err? Я хочу предотвратить что-то вроде

 _get_error_msg 2> /dev/null 
 

или

 exec 2> /dev/null

err() {
  echo -e "[$(date  '%H:%M:%S')] e[31mERRORe[0m $*" >amp;1
}
 

test.sh

 #!/bin/bash

set -Eeo pipefail

err() {
  echo -e "[$(date  '%H:%M:%S')] e[31mERRORe[0m $*" >amp;2
}

trap 'err line "${LINENO}": "${BASH_COMMAND}"' ERR

_get_error_msg
 

Я получаю этот вывод:

 ./test.sh: line 11: _get_error_msg: command not found
[04:18:36] ERROR line 11: _get_error_msg
 

Как я могу удалить

 ./test.sh: line 11: _get_error_msg: command not found
 

Или передайте эту строку также в мою функцию err(), чтобы получить что-то вроде этого

 [04:18:36] ERROR line 11: _get_error_msg: command not found
 

только одна строка, записанная в stderr?

РЕДАКТИРОВАТЬ: что-то вроде этого:

 #!/bin/bash

set -Eeo pipefail

err() {
  echo -e "[$(date  '%H:%M:%S')] e[31mERRORe[0m $*"
}

err_msg() {
  while IFS= read -r msg; do
    err "${msg}"
  done
}

exec 2> >(err_msg)
trap 'err line "${LINENO}": "${BASH_COMMAND}"' ERR


_get_error_msg
 

Комментарии:

1. Итак, вы не хотите, чтобы внутренние сообщения об ошибках bash отображались на терминале?

2. Я хочу, чтобы любой вывод stderr, который происходит, записывался моей функцией err. Так что каждая ошибка форматируется. Даже команда bash не обнаружила ошибку, но также сообщение stderr, сгенерированное такими командами, как cat -givemerror, которое также выдает ошибку, сгенерированную cat.

3. Сделайте : { _get_error_msg 2> /dev/null ;} 2>/dev/null . Something like this: Является ли это решением проблемы? Ваша программа решена?

4. Использование ловушки ОШИБОК, вероятно, не самый лучший способ сделать это. Вместо этого сделайте что-то вроде { { echo stdout; echo stderr >amp;2; } 2>amp;1 >amp;3 | perl -pe 'print localtime . ": "'; } 3>amp;1 . В комментарии это выглядит некрасиво, но вы можете обернуть весь свой скрипт целиком или использовать вспомогательный скрипт-оболочку.

5. В целом, проблемы, вызванные set -e этим, намного перевешивают минимальные выгоды. Это действительно не стоит использовать.