为什么我需要禁用=SC2031

为什么我需要禁用=SC2031

你能告诉我,为什么我必须# shellcheck disable=SC2030在下面的脚本中?

get_names_and_hosts(){

  unset LOCAL_HOSTS
  declare -a LOCAL_HOSTS

  unset LOCAL_NAMES
  declare -a LOCAL_NAMES

  multipass list --format json | jq -r '.list[] | [ .name, .ipv4[0] ] | @tsv' |
  while IFS=$'\t' read -r name ipaddress; do
      # shellcheck disable=SC2030
      LOCAL_NAMES+=("$name")
      # shellcheck disable=SC2030
      LOCAL_HOSTS+=($ipaddress)
  done

  # shellcheck disable=SC2031
  reply=("${LOCAL_NAMES[@]}" "${LOCAL_HOSTS[@]}")
  echo "${reply[@]}"
}

声明为declare -gx给出相同的警告?

答案1

因为上一行以 结尾|,所以while ... do ... done循环是管道的一部分:您是管道成循环

因此,循环可能在子 shell 中执行,因此对变量LOCAL_NAMES和的任何更改LOCAL_HOSTS都可能会丢失,具体取决于您实际使用哪个 shell 来运行此脚本:它将与 一起工作,ksh如果您有s选项集。zshbashbashlastpipe

对于其他 shell,或者使用bash的出厂默认设置,它将失败。

解释是关于https://www.shellcheck.net/wiki/SC2031你不清楚吗?

相关内容