shell脚本调试 -- 运行日志2

来源:互联网 发布:mac修图 编辑:程序博客网 时间:2024/06/04 00:41

shell脚本调试 -- 运行日志1

 
本文主要描述如何输出shell脚本中的debug日志.
 

C/C++的debug日志

    在C/C++中有 __FILE__, __func__, __LINE__ 来表示 当前这行日志来自哪个源代码文件的第几行的哪个函数.
如:
#include<stdio.h> 
/* t.c */

int main()
{
    printf("%s:%d:%s:DEBUG Hello World!\n", __FILE__, __LINE__, __func__);
    return 0;
}
/* 运行结果如下:
    $> make t
    cc t.c -o t
    $> ./t
    t.c:6:main:DEBUG Hello World!
    $> 

 */
t.c:6:main:DEBUG Hello World! 是在说, 这行信息来至 t.c 文件的第 6 行的 main 函数,这种方法可以让你在调试过程中很快的定位问题的位置.

 

shell脚本中的debug日志

 
    使用 alias 功能, 实现类似C/C++中的debug日志方法. 将文件保存到 /etc/mydebug
#!/bin/bash 
# mydebug
# Aliases are not expanded when the shell is not interactive, unless the
#+ expand_aliases shell option is set using shopt
shopt -s expand_aliases

case "$1" in
    "debug")
        alias mydebug='echo -n $(caller 0|tr " " ":"):$FUNCNAME:$LINENO:LOG:" "';
        ;;
    *)
        alias mydebug='';
        ;;
esac
 
测试:
#!/bin/bash 
# mydebug_test.sh

source /etc/mydebug debug; #如果带参数就是 debug 模式, 不带任何参数为非debug模式.

function check_apache()
{
    echo "$(mydebug)apache [OK]"
}

function check_mysql()
{
    echo "$(mydebug)mysql [OK]"
}

function check_all()
{
    check_apache;
    check_mysql;
}

check_all;
 
debug模式的运行结果:
$> /bin/bash mydebug_test.sh
18:check_all:mydebug_test.sh:check_apache:8:LOG: apache [OK]
19:check_all:mydebug_test.sh:check_mysql:13:LOG: mysql [OK]
$>
 
非debug模式的运行结果:
$> /bin/bash mydebug_test.sh 
apache [OK]
mysql [OK]
 
------------- end -------------
From: GS
-------------------------------