如何正确调试bash脚本

时间:2014-01-17 16:23:10

标签: linux bash debugging

我在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

但是当我运行它时,它会吃掉我的变量。 一些线索?

3 个答案:

答案 0 :(得分:5)

以下是一些建议:

  • 您可以随时在shell脚本中回显一行,看看发生了什么。
  • 您还可以使用set -xv来帮助您调试shell脚本。只需将set -xv放在要调试的部分之前,然后set +xv关闭调试。您还可以使用export PS4="\$LINENO> "在shell脚本中打印行号。

以下是您使用set -xv查看脚本的方式。这是调试shell脚本的一个非常好的工具。

答案 1 :(得分:5)

最好的方法是使用set -xvset -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