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的影响,而且会连脚本文件中的注释一并显示。

相关推荐
JAVA面经实录9176 小时前
Linux 常用命令完整知识体系
java·linux·开发语言·汇编
艾莉丝努力练剑12 小时前
OpenCode AI 编程:Ubuntu 24.04 环境安装与使用指南
linux·服务器·网络·人工智能·tcp/ip·ubuntu
崇山峻岭之间12 小时前
Keil5输出hex转换为bin的设置
linux·运维·服务器
谷雪_65813 小时前
Linux 网络命名空间:从内核原理到企业级容器网络架构全景实战
linux·网络·架构
qq_1631357513 小时前
Linux 【03- chgrp命令超详细教程】
linux
CodeStats14 小时前
【编程语言】深度梳理C/C++、Java、Python、Go、Rust的区别
java·linux·c语言·c++·python·rust·go
我会尽全力 乐观而坚强14 小时前
MySQL库与表的操作
linux·数据库·mysql
着迷不白15 小时前
Linux 磁盘管理完全指南:分区、文件系统、挂载与 LVM 实战
linux·运维·服务器
山川而川-R15 小时前
LangChain
linux·运维·服务器
QH_ShareHub15 小时前
Linux 根目录结构详解
linux·运维·服务器