咨询热线:4006-75-4006

售前:9:00-23:30    备案:9:00-18:00    技术:7*24h

如何在 Shell 脚本中跟踪调试命令的执行

2017-01-19 15:45:23 9134次

shell 跟踪简单的来说就是跟踪 shell 脚本中的命令的执行。要打开 shell 跟踪,请使用 -x 调试选项。

这会让 shell 在终端上显示所有执行的命令及其参数。

我们将使用下面的 sys_info.sh shell 脚本,它会简要地打印出你的系统日期和时间、登录的用户数和系统的运行时间。不过,脚本中包含我们需要查找和更正的语法错误。

#!/bin/bash# script to print brief system infoROOT_ID="0"DATE=`date`NO_USERS=`who | wc -l`UPTIME=`uptime`check_root(){  if [ "$UID" -ne "$ROOT_ID" ]; then    echo "You are not allowed to execute this program!"    exit 1;    }print_sys_info(){  echo "System Time    : $DATE"  echo "Number of users: $NO_USERS"  echo "System Uptime  : $UPTIME}check_rootprint_sys_infoexit 0

保存文件并执行脚本。脚本只能用 root 用户运行,因此如下使用 sudo 命令运行:

$ chmod +x sys_info.sh$ sudo bash -x sys_info.sh

Shell Tracing - Show Error in Script

shell 跟踪 - 显示脚本中的错误

从上面的输出我们可以观察到,首先执行命令,然后其输出做为一个变量的值。

例如,先执行 date,其输出做为变量 DATE 的值。

我们可以执行语法检查来只显示其中的语法错误,如下所示:

$ sudo bash -n sys_info.sh

Syntax Checking in Script

脚本中语法检查

如果我们审视这个 shell 脚本,我们就会发现 if 语句缺少了封闭条件的 fi 关键字。因此,让我们加上它,新的脚本应该看起来像这样:

#!/bin/bash#script to print brief system infoROOT_ID="0"DATE=`date`NO_USERS=`who | wc -l`UPTIME=`uptime`check_root(){  if [ "$UID" -ne "$ROOT_ID" ]; then    echo "You are not allowed to execute this program!"    exit 1;  fi    }print_sys_info(){  echo "System Time    : $DATE"   echo "Number of users: $NO_USERS"  echo "System Uptime  : $UPTIME}check_rootprint_sys_infoexit 0

再次保存文件并以 root 执行,同时做语法检查:

$ sudo bash -n sys_info.sh

Perform Syntax Check in Shell Scripts

在 shell 脚本中执行语法检查

上面的语法检查操作的结果仍然显示在脚本的第 21 行还有一个错误。所以,我们仍然要纠正一些语法。

再一次分析脚本,会发现第 21 行的错误是由于在 print_sys_info 函数内最后一个 echo 命令中没有闭合双引号 "

我们将在 echo 命令中添加闭合双引号并保存文件。修改过的脚本如下:

#!/bin/bash#script to print brief system infoROOT_ID="0"DATE=`date`NO_USERS=`who | wc -l`UPTIME=`uptime`check_root(){  if [ "$UID" -ne "$ROOT_ID" ]; then    echo "You are not allowed to execute this program!"    exit 1;  fi}print_sys_info(){  echo "System Time    : $DATE"  echo "Number of users: $NO_USERS"  echo "System Uptime  : $UPTIME"}check_rootprint_sys_infoexit 0

现在再一次检查语法。

$ sudo bash -n sys_info.sh

上面的命令不会产生任何输出,因为我们的脚本语法上正确。我们也可以再次跟踪脚本执行,它应该工作得很好:

$ sudo bash -x sys_info.sh

Trace Shell Script Execution

跟踪 shell 脚本执行

现在运行脚本。

$ sudo ./sys_info.sh

Shell Script to Show Date, Time and Uptime

用 shell 脚本显示日期、时间和运行时间


首页
最新活动
个人中心