Что означает чтение -r -a BUILD_ARGS_ARRAY <<< «$ @» в bash? - PullRequest
0 голосов
/ 10 июля 2019

Я прочитал какой-то фрагмент кода в build.include

set -u
prepare_build_args() {
    IFS=',' read -r -a BUILD_ARGS_ARRAY <<< "$@"
    for i in ${BUILD_ARGS_ARRAY[@]}; do
    BUILD_ARGS+="--build-arg $i "
    done
}

Мне сложно понять этот код, потому что я новичок в оболочке.

  • Является ли IFS переменная со значением ','?Почему за ним следует команда read?

  • Что означает -r -a?и что <<< делает?

  • BUILD_ARGS_ARRAY [@] не определено ранее.и есть set -u, что означает, что неназначенная переменная будет распознана как ошибка. Это проблема объема?И что означает [@]? 1023 *
  • Наконец, в моем понимании BUILD_ARGS сохранил все вещи в BUILD_ARG_ARRAY, но он не возвращается из функции prepare_build_args?

Ответы [ 2 ]

1 голос
/ 13 июля 2019

Просмотр руководства Bash может быть полезным.

  • IFS - это внутренний разделитель полей , который устанавливается до того, как команда чтения применяет его только для этой команды.

  • Встроенная команда read , опция -r останавливает обратную косую черту, искажая данные, и -a считывает в массив (в данном случае BUILD_ARGS_ARRAY). <<< - это здесь строка , которая направляет аргументы функции prepare_build_args на команду read.

  • BUILD_ARGS_ARRAY устанавливается командой read. Синтаксис [@] Bash расширяет массив .

  • Область действия переменной является глобальной, если не используется локальная встроенная функция.

0 голосов
/ 13 июля 2019

Короче, этот код:

  • Объединяет все аргументы вашей функции вместе в одну строку (обычно это то, что делает "$*", но "$@" делает то же самое, когда используется в контексте, где его результат оценивается как одна строка).
  • Разбивает эту строку на запятые, сохраняя результат в массиве с именем BUILD_ARGS_ARRAY
  • Принимает массив, объединяет его аргументы в одну строку (снова!), Разбивает эту строку на пробел, расширяет каждый компонент, сгенерированный этой операцией разбиения, как операцию glob и выполняет итерацию по результатам glob.
  • Для каждого результата глобуса добавляет строку --build-arg <result> к BUILD_ARGS.

Это очень глючно и никогда не должно использоваться кем-либо. Для более подробного объяснения:

  • "$@" предназначен для использования там, где его результат можно рассматривать как список. Расширение его в строковом контексте отбрасывает исходное разделение между аргументами, заменяя их первым символом в IFS (в контексте, в котором выполняется расширение, не в расширении read в который результат потребляется).
  • Расширения ${foo[@]} без кавычек делают поведение этого кода чувствительным к тому, содержат ли ваши аргументы символы-заглушки, и если да, то какие файлы существуют в каталоге, в котором они выполняются, и являются ли nullglob, failglob или подобные варианты установлены. См. shellcheck предупреждение SC2068 .
  • Чистым эффектом этой операции является создание строки, которая, вероятно, будет расширена при генерации командной строки. Строки не могут быть безопасно использованы таким образом в общем случае; см. BashFAQ # 50 с описанием ловушек, предостережений и альтернативных подходов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...