Linux shell编程学习笔记29:shell自带的 脚本调试 选项

Linux shell脚本的调试方法比较多,上次我们探讨和测试了shell内建命令set所提供的一些调试选项,其实 shell 本身也提供了一些调试选项。我们以bash为例来看看。

1 bash 的命令行帮助信息(bash --help)

purleEndurer @ csdn ~ $ ++bash --help++

GNU bash, version 4.2.46(2)-release-(x86_64-redhat-linux-gnu)

Usage: bash GNU long option option ...

bash GNU long option option script-file ...

GNU long options:

--debug

--debugger

--dump-po-strings

--dump-strings

--help

--init-file

--login

--noediting

--noprofile

--norc

--posix

--protected

--rcfile

--rpm-requires

--restricted

--verbose

--version

Shell options:

-irsD or -c command or -O shopt_option (invocation only)

-abefhkmnptuvxBCHP or -o option

Type `bash -c "help set"' for more information about shell options.

Type `bash -c help' for more information about shell builtin commands.

purleEndurer @ csdn ~ $

可以看到,bash命令有很多参数和选项。

使用 bash 命令加上特定的选项可以在运行Shell脚本时改变其行为,帮助我们诊断问题。

2 bash 的内置命令set提供的选项(bash -c "help set" )

我们可以使用命令 bash -c "help set" 查看 bash 内置命令set提供的选项。

purpleEndurer @ cdu ~ $ ++bash -c "help set"++

set: set -abefhkmnptuvxBCHP -o option-name -- arg ...

Set or unset values of shell options and positional parameters.

Change the value of shell attributes and positional parameters, or

display the names and values of shell variables.

Options:

-a Mark variables which are modified or created for export.

-b Notify of job termination immediately.

-e Exit immediately if a command exits with a non-zero status.

-f Disable file name generation (globbing).

-h Remember the location of commands as they are looked up.

-k All assignment arguments are placed in the environment for a

command, not just those that precede the command name.

-m Job control is enabled.

-n Read commands but do not execute them.

-o option-name

Set the variable corresponding to option-name:

allexport same as -a

braceexpand same as -B

emacs use an emacs-style line editing interface

errexit same as -e

errtrace same as -E

functrace same as -T

hashall same as -h

histexpand same as -H

history enable command history

ignoreeof the shell will not exit upon reading EOF

interactive-comments

allow comments to appear in interactive commands

keyword same as -k

monitor same as -m

noclobber same as -C

noexec same as -n

noglob same as -f

nolog currently accepted but ignored

notify same as -b

nounset same as -u

onecmd same as -t

physical same as -P

pipefail the return value of a pipeline is the status of

the last command to exit with a non-zero status,

or zero if no command exited with a non-zero status

posix change the behavior of bash where the default

operation differs from the Posix standard to

match the standard

privileged same as -p

verbose same as -v

vi use a vi-style line editing interface

xtrace same as -x

-p Turned on whenever the real and effective user ids do not match.

Disables processing of the $ENV file and importing of shell

functions. Turning this option off causes the effective uid and

gid to be set to the real uid and gid.

-t Exit after reading and executing one command.

-u Treat unset variables as an error when substituting.

-v Print shell input lines as they are read.

-x Print commands and their arguments as they are executed.

-B the shell will perform brace expansion

-C If set, disallow existing regular files to be overwritten

by redirection of output.

-E If set, the ERR trap is inherited by shell functions.

-H Enable ! style history substitution. This flag is on

by default when the shell is interactive.

-P If set, do not follow symbolic links when executing commands

such as cd which change the current directory.

-T If set, the DEBUG trap is inherited by shell functions.

-- Assign any remaining arguments to the positional parameters.

If there are no remaining arguments, the positional parameters

are unset.

  • Assign any remaining arguments to the positional parameters.

The -x and -v options are turned off.

Using + rather than - causes these flags to be turned off. The

flags can also be used upon invocation of the shell. The current

set of flags may be found in $-. The remaining n ARGs are positional

parameters and are assigned, in order, to 1, 2, .. $n. If no

ARGs are given, all shell variables are printed.

Exit Status:

Returns success unless an invalid option is given.

purpleEndurer @ cdu ~ $

这个信息与

Linux shell编程学习笔记28:脚本调试 set命令https://blog.csdn.net/Purpleendurer/article/details/134506337?spm=1001.2014.3001.5501中set --help命令显示的帮助信息是一致的。

3 查看bash内置的命令:bash -c help

purpleEndurer @ csdn ~ $ ++bash -c help++

GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

These shell commands are defined internally. Type `help' to see this list.

Type `help name' to find out more about the function `name'.

Use `info bash' to find out more about the shell in general.

Use `man -k' or `info' to find out more about commands not in this list.

A star (*) next to a name means that the command is disabled.

job_spec \& history -c -d offset n or hist>

(( expression )) if COMMANDS; then COMMANDS; [ elif C>

. filename arguments jobs -lnprs jobspec ... or jobs >

: kill [-s sigspec | -n signum | -sigs>

arg... \] let arg \[arg ...

\[ expression ] local option name=value ...

alias -p name\[=value ... ] logout n

bg job_spec ... mapfile -n count -O origin [-s c>

bind -lpvsPVS -m keymap -f filen\> popd \[-n +N \| -N

break n printf -v var format arguments

builtin shell-builtin \[arg ...] pushd -n +N \| -N \| dir

caller expr pwd -LP

case WORD in PATTERN \[\| PATTERN...)> read -ers -a array -d delim [->

cd -L\|\[-P \[-e]] dir readarray -n count -O origin [-s>

command -pVv command arg ... readonly -aAf name\[=value ...] o>

compgen -abcdefgjksuv -o option > return n

complete -abcdefgjksuv -pr -DE > select NAME in WORDS ... ; do COMM>

compopt -o\|+o option -DE name ..\> set \[-abefhkmnptuvxBCHP [-o option->

continue n shift n

coproc NAME command redirections shopt -pqsu -o optname ...

declare -aAfFgilrtux -p name\[=va\> source filename \[arguments

dirs -clpv +N -N suspend -f

disown -h -ar jobspec ... test expr

echo -neE arg ... time -p pipeline

enable -a -dnps -f filename [na> times

eval arg ... trap -lp \[arg signal_spec ...]

exec -cl -a name [command [argume> true

exit n type -afptP name name ...

export -fn name\[=value ...] or ex> typeset -aAfFgilrtux -p name[=va>

false ulimit -SHacdefilmnpqrstuvx [limit>

fc -e ename -lnr first last o> umask -p -S mode

fg job_spec unalias -a name name ...

for NAME in WORDS ... ; do COMMAND> unset -f -v name ...

for (( exp1; exp2; exp3 )); do COMMAN> until COMMANDS; do COMMANDS; done

function name { COMMANDS ; } or name > variables - Names and meanings of so>

getopts optstring name arg wait id

hash -lr -p pathname -dt [name > while COMMANDS; do COMMANDS; done

help -dms pattern ... { COMMANDS ; }

purpleEndurer @ csdn ~ $

2 bash 命令行常用调试选项说明和演示

下面我们就bash命令行中的一些常用的调试选项逐一进行说明和演示。

2.1 echo $-:显示当前已启动的选项

purpleEndurer @ cdu ~ ++echo -++

himBH

purpleEndurer @ cdu ~ $

可以看到,当前启用的选项有h、i、m、B和H这几个选项处于启动状态。

2.2 bash -n 脚本文件名说明符:不执行脚本,仅检查错误

-n 选项的功能是:读一遍脚本中的命令但不执行,用于检查脚本中的语法等错误。

2.2.1 创建测试脚本文件a.sh

我们用 cp 命令来创建 ,文件内容是: echo 'Hello world

为了测试,我们故意漏了命令行末尾配对的单引号。

purleEndurer @ csdn ~ $ ++cp /dev/stdin a.sh++

echo 'Hello world

2.2.2 查看测试脚本文件a.sh内容

purleEndurer @ ++csdn ~ $ cat a.sh++

echo 'Hello world

2.2.3 检查脚本语法错误

purleEndurer @ csdn ~ $ ++bash -n a.sh++

a.sh: line 1: unexpected EOF while looking for matching `''

a.sh: line 2: syntax error: unexpected end of file

可以看到,bash检查出a.sh存在两个错误。

第1个错误出现在第1行:寻找匹配的 ''' 时出现意外的 EOF,即单引号未配对。

第2个错误出现在第2行:语法错误:意外的文件结尾。

2.3 bash -x 脚本文件说明符:先显示命令及参数(不显示注释),再显示执行结果

bash命令的-x选项与set 命令中的-x选项功能相同,都是打开echo模式,执行命令后,会先显示该命令及所带的参数,再显示命令执行的结果:

2.3.1 创建测试脚本文件a.sh

我们用 cp 命令来创建 a.sh,文件内容如下:

bash 复制代码
purleEndurer @ csdn ~ $ cp /dev/stdin a.sh
echo -n Enter your name please:    # 提示用户输入名字
read n                             # 将用户输入的名字保存到变量n                                                                            
echo Your name is $n               # 显示用户输入的名字      

#号后的内容是对命令功能的说明。

2.3.2 执行脚本文件a.sh

purleEndurer @ csdn ~ $ ++bash -x a.sh++

  • echo -n Enter your name please:

Enter your name please:+ read n
++purpleEndurer++

  • echo Your name is purpleEndurer

Your name is purpleEndurer

purleEndurer @ csdn ~ $

bash会将以+开头,将执行的命令显示出来,然后再显示命令执行的结果。

2.3.3 使用环境变量PS4定制显示格式

其实我们在使用bash的 -x选项来显示命令和参数时前面加的 + 是环境变量PS4 保存的。

purpleEndurer @csdn ~ $ ++set | grep PS4++

PS4='+ '

因此,我们可以通过修改环境变量PS4的值来设置 bash的 -x选项显示命令和参数时的格式。

例如:我们对显示的命令和参数以 > 开头,然后引入{BASH_SOURCE} 显示脚本文件名,{LINENO}显示行号,${FUNCNAME0}显示正在执行的函数的名字:

purpleEndurer @csdn ~ ++PS1="\\e\[35mpurpleEndurer\\e\[0m @csdn \\w "++

purpleEndurer @csdn ~ ++export PS4='\>{BASH_SOURCE} ${LINENO}++ ++${FUNCNAME0}: '++

purpleEndurer @csdn ~ $ b++ash -x a.sh++

>a.sh 1 : echo -n Enter your name please:

Enter your name please:>a.sh 2 : read n

abc

>a.sh 3 : echo Your name is abc

Your name is abc

purpleEndurer @csdn ~ $

如果觉得字符太多,不容易辨别的话,我们还可以分别给它们加上颜色:

purpleEndurer @csdn ~ ++export PS4='\\e\[35m\>{BASH_SOURCE} \e0m \\e\[33m \[${LINENO}\e0m \\e\[31m ${FUNCNAME\[0}: \e[0m'++

purpleEndurer @csdn ~ $ ++bash -x a.sh++

>a.sh 1 : echo -n Enter your name please:

Enter your name please:>a.sh 2 : read n

abc

>a.sh 3 : echo Your name is abc

Your name is abc

这里我们使用了

Linux shell编程学习笔记4:修改命令行提示符格式(内容和颜色)https://blog.csdn.net/Purpleendurer/article/details/133416124?spm=1001.2014.3001.5501中介绍的知识,让脚本文件名以紫色显示,行号以黄色显示,正在执行的函数的名字以红色显示。

2.4 bash -v 脚本文件说明符:一边执行脚本,一边将执行过的脚本命令打印到标准输出(包括注释)

purpleEndurer @csdn ~ ++export PS4='\\e\[35m\>{BASH_SOURCE} \e0m \\e\[33m \[${LINENO}\e0m \\e\[31m ${FUNCNAME\[0}: \e[0m'++

purpleEndurer @csdn ~ $ ++bash -v a.sh++

echo -n Enter your name please: # 提示用户输入名字

Enter your name please:read n # 将用户输入的名字保存到变量n

abc

echo Your name is $n # 显示用户输入的名字

Your name is abc

purpleEndurer @csdn ~ $

可以看到,-v选项显示所执行的命令不受环境变量PS4的影响,而且会连脚本文件中的注释一并显示。

相关推荐
vortex512 分钟前
Linux进程权限继承研究:从setuid()到exec()与system()的行为差异
linux·服务器·系统安全·suid
swordbob31 分钟前
3 大 I/O 模型BIO / NIO / AIO
java·linux·spring
小小小花儿36 分钟前
服务器上修改个人账户权限
linux·服务器
Coisinier39 分钟前
RHCE中shell脚本基础(磁盘剩余空间监控,Web 服务状态检查,curl 访问 Web 服务并返回状态)
linux·运维·服务器·前端·nginx·操作系统
暮云星影2 小时前
全志linux开发屏幕适配(二)`HDMI`驱动适配说明
linux·arm开发·驱动开发
凡人叶枫2 小时前
Effective C++ 条款38:通过复合塑模出 has-a 或 \“根据某物实现出\
linux·开发语言·c++·windows
charlie1145141912 小时前
嵌入式Linux驱动开发——从轮询到中断
linux·开发语言·驱动开发·嵌入式
无限进步_2 小时前
【Linux】系统级文件I/O与文件描述符深度剖析
linux·运维·服务器
ShineWinsu2 小时前
对于Linux:线程局部存储(TLS)和线程封装的解析
linux·c++·面试·线程·tls·线程封装·线程局部存储