Невозможно напечатать последнюю строку с помощью awk после использования trap в bash-скрипте

#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