存储未扩展变量的DEBUG陷阱

时间:2018-03-27 06:25:11

标签: bash shell

我正在尝试捕获在我的脚本中运行的命令,以便记录器可以重复这些命令。我的一个函数执行存储在数组中的命令。当它这样做时,我的DEBUG陷阱将命令存储在另一个数组中,存储未扩展的变量而不是运行的命令。

以下是一个例子:

set -o functrace
queue=("echo stuff" "echo things")
commands=()
lastcmd () { echo "Last command: ${commands[-4]}" ; }
runqueue () {
    until [[ "${#queue[@]}" == 0 ]] ; do
        ${queue[-1]}
        lastcmd
        unset "queue[-1]"
     done
}
trap 'commands+=("$BASH_COMMAND")' DEBUG
runqueue

这导致以下输出:

bash-4.4$ runqueue
things
Last command: ${queue[-1]}
stuff
Last command: ${queue[-1]}

有没有办法在扩展后记录命令?

1 个答案:

答案 0 :(得分:2)

记录调试信息的标准选项是:

  • set -v:在展开前显示命令
  • set -x:展开扩展后的命令

在您的特定情况下eval echo "Last command: ${commands[-4]}" ;将评估

eval echo "Last command: ${commands[-4]}"
# after expansion
eval echo "Last command: ${queue[-1]}"
# after eval
echo Last command: echo thing

或者更容易,直接

lastcmd () { echo "Last command: ${queue[-1]}" ; }