bash中的-r -a BUILD_ARGS_ARRAY <<<“ $ @”是什么意思?

时间:2019-07-10 08:50:08

标签: bash shell

我在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
}

由于我是Shell的新手,所以我很难理解这段代码。

  • IFS是分配了值','的变量吗?为什么后面要跟read命令?

  • -r -a是什么意思? <<<会做什么?

  • BUILD_ARGS_ARRAY [@]在之前未定义。并且存在set -u,这意味着未分配的变量将被识别为错误。这是范围的问题吗? [@]是什么意思?
  • 最后,据我了解,BUILD_ARGS将所有内容存储在BUILD_ARG_ARRAY中,但是它不会从prepare_build_args函数中返回吗?

2 个答案:

答案 0 :(得分:1)

浏览Bash manual可能会有所帮助。

  • IFS是Internal Field Separator,在read命令仅将其应用于该命令之前进行设置。

  • read builtin command选项$this->client = new GuzzleClient(['defaults' => [ 'verify' => false ]]); 停止反斜杠处理数据,并且-r读入数组(在这种情况下为-a)。 BUILD_ARGS_ARRAYhere string,它将arguments of the function <<<引向prepare_build_args命令。

  • readBUILD_ARGS_ARRAY命令设置。 read Bash语法扩展了array

  • 除非使用本地内置,否则
  • Variable scope是全局的。

答案 1 :(得分:0)

简而言之,这段代码:

  • 将您所有函数的参数连接在一起成为一个字符串(通常这是import time def redraw(delay, color, canvas): time.sleep(delay) #some parentheses are for the arguments (canvas).create_(shape)(blah, outline=(color), fill=(color)) 的作用,但是"$*"在将结果作为单个字符串求值的上下文中使用也是如此) 。
  • 以逗号分隔该字符串,并将结果存储在名为"$@"的数组中
  • 获取数组,将其参数连接为单个字符串(再次!),在空格上拆分该字符串,将拆分操作生成的每个组件扩展为glob操作,并遍历glob结果。
  • 对于每个全局结果,将字符串BUILD_ARGS_ARRAY附加到--build-arg <result>

这是非常多的错误,绝对不能被任何人使用。要详细了解原因,请执行以下操作:

  • BUILD_ARGS适用于将其结果视为列表的情况。在字符串上下文中扩展它会抛弃参数之间的原始分隔,将其替换为"$@"中的第一个字符(在扩展完成的情况下, not 扩展{ {1}},其中消耗了结果。
  • 未加引号的IFS扩展使此代码的行为对您的参数是否包含globbing字符(如果包含)以及运行它的目录中存在哪些文件以及read,{{ 1}}或类似的选项。请参阅shellcheck警告SC2068
  • 此操作的最终效果是构建一个字符串,该字符串可能会在生成命令行时扩展。通常情况下,不能安全地使用字符串。请参阅BashFAQ #50,其中描述了陷阱,警告和替代方法。