这篇文章介绍一下Bash中的环境变量PS4。
PS4 是什么
PS4 是Prompt String 4的缩写,它是Linux/Unix下的一个用于控制脚本调试显示信息的环境变量。
Bash脚本的语法检查与调试
关于Bash脚本的语法检查与调试的介绍可以参看:
示例代码
本文使用如下示例代码对PS4的使用进行说明:
liumiaocn:~ liumiao$ cat test_syntax.sh
#!/bin/bash
GREETINGS=$1
CURRENT_DIR=`pwd`
if [ _"HELLO" = _"${GREETINGS}" ]; then
echo "liumiao, current dir is : ${CURRENT_DIR}"
fi
liumiaocn:~ liumiao$
PS4使用示例:缺省设定下的sh -x
PS4缺省为+,这种状态下使用sh -x进行调试,结果显示如下所示:
liumiaocn:~ liumiao$ echo $PS4
+
liumiaocn:~ liumiao$ sh -x test_syntax.sh
+ GREETINGS=
++ pwd
+ CURRENT_DIR=/Users/liumiao
+ '[' _HELLO = _ ']'
liumiaocn:~ liumiao$
注意:pwd所在的行,由于是展开的命令,所以有两个+
PS4使用示例:自定义显示信息Debug Info
如果设定PS4=Debug Info,结果显示如下所示:
liumiaocn:~ liumiao$ export PS4="Debug Info:"
liumiaocn:~ liumiao$ sh -x test_syntax.sh
Debug Info:GREETINGS=
DDebug Info:pwd
Debug Info:CURRENT_DIR=/Users/liumiao
Debug Info:'[' _HELLO = _ ']'
liumiaocn:~ liumiao$
可以看到pwd命令展开之处,提示信息为DDebug Info:,这是因为第一个字符会根据层次进行重复,所以建议第一个字符为+或者-这类型的字符,比如:
liumiaocn:~ liumiao$ export PS4="+Debug Info: "
liumiaocn:~ liumiao$ sh -x test_syntax.sh
+Debug Info: GREETINGS=
++Debug Info: pwd
+Debug Info: CURRENT_DIR=/Users/liumiao
+Debug Info: '[' _HELLO = _ ']'
liumiaocn:~ liumiao$
PS4使用示例:显示行号和函数名称
修改一下此处的示例脚本,修改后如下所示:
liumiaocn:~ liumiao$ cat test_syntax.sh |awk '{printf("%s %s\n",NR,$0)}'
1 #!/bin/bash
2
3 GREETINGS=$1
4 CURRENT_DIR=`pwd`
5
6 greetings() {
7 if [ _"HELLO" = _"${GREETINGS}" ]; then
8 echo "liumiao, current dir is : ${CURRENT_DIR}"
9 fi
10 }
11
12 greetings
liumiaocn:~ liumiao$
使用PS4结合内建的环境变量可以显示行号和函数名称等,示例如下所示:
liumiaocn:~ liumiao$ export PS4='+$LINENO: {${FUNCNAME[0]}} '
liumiaocn:~ liumiao$ sh -x test_syntax.sh
+3: {} GREETINGS=
++4: {} pwd
+4: {} CURRENT_DIR=/Users/liumiao
+12: {} greetings
+7: {greetings} '[' _HELLO = _ ']'
liumiaocn:~ liumiao$