Этот сценарий bash записывает массив в файл, а затем считывает файл обратно в другой массив. (Это полезно для обмена данными между сценариями на основе массивов.) Однако странная ошибка, о которой не сообщается, перехватывается строкой IFS
(строка 12). Почему?
#!/bin/bash
# eso-error-ic
trap 'echo Error trapped, with code $?, on line ${LINENO}' ERR
# write data to a file
arr=(0 abc) && printf "%s\n" "${arr[@]}" > eso.out
# read data from the file into an array
# throws an error!!
IFS=$'\n' read -d '' -a new_arr < eso.out
# but it worked...
echo ${new_arr[0]}
echo ${new_arr[1]}
Вывод скрипта:
Error trapped, with code 1, on line 12
0
abc
Чего не хватает, так это какого-либо сообщения, отображаемого при возникновении ошибки. Все, что вы получаете, это сообщение от ловушки, но не сообщение о что ошибка является.
Другими словами, строка IFS/read выдает ошибку, которая перехватывается, но сообщение об ошибке не отображается, и строка правильно считывает файл в переменную массива. Он работает, не сообщает об ошибке, но ловится «ошибка».
Если вы закомментируете строку ловушки ИЛИ переключитесь на подход command/eval/cat для чтения файла в массив (как было предложено здесь), ошибка не фиксируется. Вот как будет выглядеть строка command/eval/cat для этого скрипта (заменяет строку 12):
IFS=$'\n' GLOBIGNORE='*' command eval 'new_arr=($(cat eso.out))'
read -d '' variable <<<"moo"; echo $?
- person tripleee   schedule 15.02.2018set -e
и/или ERR обычно считаются плохой идеей. См. BashFAQ #105, пропуская аллегорию для упражнений ниже, если вы спешите; или список несовместимостей между реализациямиset -e
в разных оболочках (и, соответственно, степень непредсказуемости его поведения) здесь. - person Charles Duffy   schedule 15.02.2018readarray -t new_arr <eso.dat
(если вам не нужна совместимость с bash до 4.x) -- за исключением случаев, когда вы читаете из подстановки процесса вместо файла, таким образом, переход от успеха или неудачи этого процесса к успехуread
путем добавления завершающего или NUL или нет, является активно полезной возможностью. - person Charles Duffy   schedule 15.02.2018readarray
в том, что он недоступен на bash 4.4 на Apple, платформе, на которой я обычно тестирую перед переходом на сервер. Почему? Без понятия. - person DarkerIvy   schedule 15.02.2018echo $BASH_VERSION
в том же контексте интерпретатора оболочки, который генерирует любое сообщение оreadarray
недоступности. - person Charles Duffy   schedule 15.02.2018