#bash #scripting #bash-trap
#bash #сценарии #bash-trap
Вопрос:
Файл Bash в виде
#!/bin/bash
SomeErrorHandler () {
(( errcount = $? ))
echo -e $errcount
}
trap SomeErrorHandler ERR
uname a 2>/dev/null
uname a 2>/dev/null
uname a 2>/dev/null
uname a 2>/dev/null
uname a 2>/dev/null
uname -a 1>/dev/null
declare -a f
# this is never printed
f="$(SomeErrorHandler)"
echo -e "$f" | awk 'END {print}'
Я хочу, чтобы возвращаемое значение было из значения a
как
1
2
3
4
5
чтобы вернуть последнее совпадение, 5
вместо этого вывод просто повторяет все в a
.
Я также пробовал с sed
, но результат тот же. Кажется, что это всего лишь одна запись
Комментарии:
1. Я сомневаюсь, что это ваша проблема (я не могу понять, что вы действительно пытаетесь сделать), но
awk 'END {print}'
это неопределенное поведение для POSIX. Он либо напечатает значение последней прочитанной строки, либо напечатает нулевую строку, либо сделает что-нибудь еще. Используйтеawk '{rec=$0} END{print rec}'
для переносимости, если вы пытаетесь использовать awk для имитацииtail -1
.
Ответ №1:
Вы думаете, что все echo
файлы из SomeErrorHandler()
хранятся в переменной f
?
Этого не происходит.
SomeErrorHandler () {
if (( $# > 0 )); then
echo -e $errcount
else
(( errcount = $? ))
fi
}
trap SomeErrorHandler ERR
errcount=0
uname a 2>/dev/null
uname a 2>/dev/null
uname a 2>/dev/null
uname a 2>/dev/null
uname a 2>/dev/null
uname -a 1>/dev/null
# Use a random parameter for displaying the current value
SomeErrorHandler show