#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
этим, намного перевешивают минимальные выгоды. Это действительно не стоит использовать.