我正在尝试捕获在我的脚本中运行的命令,以便记录器可以重复这些命令。我的一个函数执行存储在数组中的命令。当它这样做时,我的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]}
有没有办法在扩展后记录命令?
答案 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]}" ; }