Bash "declare -p" returns 信息不完整

Bash "declare -p" returns incomplete info

具有以下脚本 test1.sh 我想知道没有获得 已声明 变量的完整列表 declare -p 的原因是什么。对于 BASH_COMMAND,令人惊讶的是我没有看到值,而只看到 declare -- BASH_COMMAND。使用变量后 declare -p returns 正确。

背后的原因是什么?我错过了什么?我也找不到 declare -- 的含义。我该怎么做才能查看所有用于调试目的的变量?

#!/bin/bash
set -o errexit -o pipefail -o noclobber -o nounset -o posix -o errtrace -o functrace -o hashall
# -o xtrace

function trapExit() {
  #here we get the INCORECT declare with BASH_COMMAND having no value
  declare -p | grep BASH_COMMAND
  declare -p | grep BASH_COMMAND
  value=$BASH_COMMAND
  #here we get the CORRECT declare with BASH_COMMAND having the value
  declare -p | grep BASH_COMMAND
  echo "valueOfCommand=$value"
}

function test2() {
  ${MISSING_PARAM?"Parameter is missing in function test2"}
}

trap trapExit exit

test2

: <<END_COMMENT

$ ./test1.sh
./test1.sh: line 15: MISSING_PARAM: Parameter is missing in function test2
declare -- BASH_COMMAND
declare -- BASH_COMMAND="${MISSING_PARAM?\"Parameter is missing in function test2\"}"
valueOfCommand=${MISSING_PARAM?"Parameter is missing in function test2"}

END_COMMENT

BASH_COMMAND 是一个 动态 变量,它的值仅在您引用它时更新。

  1. 最初当Bash开始时,BASH_COMMAND只是被声明而没有被赋值。
  2. 当你declare -p | grep BASH_COMMAND (不管多少次) var 仍然没有被引用,所以它仍然没有价值。
    • 这可以通过在调用 test2 之前添加 v=$BASH_COMMAND 来验证。
    • 类似RANDOM的变量类似,可以试试declare -p | grep -w RANDOM
    • 而不是 declare -p | grep BASH_COMMAND 你可以 declare -p BASH_COMMAND.
  3. 然后 value=$BASH_COMMAND 它被引用并且 Bash 使用触发陷阱的命令更新它。
  4. 然后declare -p也可以显示它的值

--declare -- 一样没有特殊含义。它只是“发出选项结束的信号并禁用进一步的选项处理”,尽管在这种情况下它并不是真正必要的。