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
是一个 动态 变量,它的值仅在您引用它时更新。
- 最初当Bash开始时,
BASH_COMMAND
只是被声明而没有被赋值。
- 当你
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
.
- 然后
value=$BASH_COMMAND
它被引用并且 Bash 使用触发陷阱的命令更新它。
- 然后
declare -p
也可以显示它的值
--
和 declare --
一样没有特殊含义。它只是“发出选项结束的信号并禁用进一步的选项处理”,尽管在这种情况下它并不是真正必要的。
具有以下脚本 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
是一个 动态 变量,它的值仅在您引用它时更新。
- 最初当Bash开始时,
BASH_COMMAND
只是被声明而没有被赋值。 - 当你
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
.
- 这可以通过在调用
- 然后
value=$BASH_COMMAND
它被引用并且 Bash 使用触发陷阱的命令更新它。 - 然后
declare -p
也可以显示它的值
--
和 declare --
一样没有特殊含义。它只是“发出选项结束的信号并禁用进一步的选项处理”,尽管在这种情况下它并不是真正必要的。