我在bash脚本中使用以下代码来跟踪代码
#!/bin/bash
function trace()
{
echo "TRACE" \
"${BASH_SOURCE[1]}:${BASH_LINENO[0]}:${FUNCNAME[1]}:" \
"$BASH_COMMAND"
}
set -o functrace
shopt -s extdebug
trap trace DEBUG
# Remainder of code here
exit 0
但是当我运行它时,它会吃掉我的变量。 一些线索?
答案 0 :(得分:5)
以下是一些建议:
set -xv
来帮助您调试shell脚本。只需将set -xv
放在要调试的部分之前,然后set +xv
关闭调试。您还可以使用export PS4="\$LINENO> "
在shell脚本中打印行号。以下是您使用set -xv
查看脚本的方式。这是调试shell脚本的一个非常好的工具。
答案 1 :(得分:5)
最好的方法是使用set -xv
。 set -v
将在执行之前回显一行。在shell脚本插入该行中的变量和表达式后,set -x
将输出该行。
作为其中的一部分,您还可以创建一个名为PS4
的环境变量,每当您的shell脚本输出正在执行的行时,该变量将被打印。大多数人将其设置为类似PS="\$LINENO: "
的内容,它将打印出正在执行的行的行号。
完成后,您可以通过设置set +xv
来关闭调试。
#
# Somewhere in this part of my script, I am having problems....
#
export PS4="\$LINENO> " # Now, I'll see the line numbers while debugging
set -xv # Debugging is turned on
....
#
# Done with debugging
#
set +xv # Debugging is turned off
答案 2 :(得分:0)
以下设置将启用每个命令的行号和函数名的打印(假设您以后将set -x
放在要调试的代码之前):
set -o functrace
shopt -s extdebug
PS4='+ line ${LINENO-}, in ${FUNCNAME-}(): '
下面是一些测试上面的代码:
foo() { echo "now in $FUNCNAME"; bar; }
bar() { echo "now in $FUNCNAME"; baz; }
baz() { echo "now in $FUNCNAME"; }
set -x
foo