Linux shell编程学习笔记28:脚本调试 set命令

0 引入

在Linux Shell 脚本编程的过程中,编写简单功能的脚本,代码不多,一般阅读起来没什么难度,有问题也比较有查出原因和修正。但是当脚本要实现的功能较多,代码变得较为复杂时,阅读起来就不那么容易看明白了,如果其中存在问题,要排查原因并修正所面临的困难也更大了,所以掌握一些调试方法还是很有必要的。

Linux shell的调试方法比较多,现在我们先看看shell内建命令set。

1 set 命令的功能

set命令用于查看和修改 Shell 环境的运行参数,我们可以依照不同的需求来设置shell的执行方式,实现定制 Shell 脚本的运行环境。

2 在bash中查看set命令的帮助信息

2.1 set --help:查看set命令格式

csdn @ edu ~ $ set --help
bash: set: --: invalid option
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]

 set 命令没有--help这个参数,但它提供了set命令的格式。

2.2 help set:完整的帮助信息

csdn @ edu ~ $ 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.

2.3 这些命令在zsh中无效

csdn @ edu zsh $ help set 
zsh: command not found: help
csdn @ edu zsh $ set --help

csdn @ edu zsh $ 

3 set 命令格式和说明

3.1 set 命令格式

set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]

3.2 set 命令说明

选项

选项名

功能说明

-a

allexport

标示已修改的变量,以供输出至环境变量。

-b

braceexpand

使被中止的后台程序立刻回报执行状态。

-C

noclobber

转向所产生的文件无法覆盖已存在的文件。

-d

Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。
emacs使用emacs内置编辑器进行命令行编辑,是一个默认设置

-e

errexit

若指令传回值不等于0,则立即退出shell。

-f

取消使用通配符 。

-h

自动记录函数的所在位置。
history启用命令行历史、默认为启用

-H

histexpand

Shell可利用"!"加<指令编号>的方式来执行history中记录的指令。
ignoreeof禁止用EOF(Ctrl+D)键退出shell。必须键入exit才能退出。等价于设置shell变量IGNOREEOF=10
interactive-comments对于交互式shell,把#符后面的文本作为注释

-k

keyword

指令所给的参数都会被视为此指令的环境变量。

-l

记录for循环的变量名称。

-m

monitor

使用监视模式。

-n

noexec

只读取指令,而不实际执行。
-o [option-name] 启动指定选项的设置。如果未指定选项名称,则显示所有配置情况。
+o [option-name] 

取消指定选择的设置。

如果未指定选项名称,功能在bash和zsh中不完全相同:

  • 在bash中,会显示所有配置情况。
  • 在zsh中,会显示所有的启用的配置情况。

-p

privileged

启动优先顺序模式。shell不读取.profile或ENV文件,且不从环境继承shell函数,将自动为setuid脚本开启特权

-P

physical

启动-P参数后,执行指令cd或pwd时,会以实际的文件或目录来取代符号连接。

-t

onecmd

执行完随后的指令,即退出shell。

-u

nounset当执行时使用到未定义过的变量,则显示错误信息。

-v

verbose

显示shell所读取的输入值
vi使用vi内置编辑器进行命令行编辑

-x

xtrace为调试打开echo模式,执行命令后,会先显示该命令及所带的参数,再显示命令执行的结果

+<参数>

取消某个set曾启动的参数。

4 实例

4.1 set:不带任何参数,会显示所有的环境变量和 Shell 函数。

csdn @ edu ~ $ set
BASH=/usr/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
COLUMNS=193
DIRSTACK=()
EUID=1000
GROUPS=()
HISTFILE=/home/csdn/.bash_history
HISTFILESIZE=500
HISTSIZE=500
HOME=/home/csdn
HOSTNAME=edu
HOSTTYPE=x86_64
IFS=$' \t\n'
LC_ALL=zh_CN.UTF-8
LESS=-R
LINES=39
LOGNAME=csdn
LSCOLORS=Gxfxcxdxbxegedabagacad
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAILCHECK=60
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PAGER=less
PATH=/home/csdn/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PIPESTATUS=([0]="0")
PPID=133
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='csdn @ edu \w $ '
PS2='> '
PS4='+ '
PWD=/home/csdn
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=2
TERM=xterm
UID=1000
ZSH=/home/csdn/.oh-my-zsh
_=
colors=/home/csdn/.dircolors

4.2 set  -o:显示所有配置情况(不同的shell配置数量不同)

4.2.1 bash中(27个)

csdn @ edu bash ~ $ set -o
allexport       off
braceexpand     on
emacs           on
errexit         off
errtrace        off
functrace       off
hashall         on
histexpand      on
history         on
ignoreeof       off
interactive-comments    on
keyword         off
monitor         on
noclobber       off
noexec          off
noglob          off
nolog           off
notify          off
nounset         off
onecmd          off
physical        off
pipefail        off
posix           off
privileged      off
verbose         off
vi              off
xtrace          off

 

bash中配置数量为 27个,跟帮助信息中数量一致。

4.2.2 在zsh中(169个)

csdn @edu zsh $ set -o
noaliases             off
allexport             off
noalwayslastprompt    off
alwaystoend           on
noappendhistory       off
autocd                on
autocontinue          off
noautolist            off
noautomenu            off
autonamedirs          off
noautoparamkeys       off
noautoparamslash      off
autopushd             on
noautoremoveslash     off
autoresume            off
nobadpattern          off
nobanghist            off
nobareglobqual        off
bashautolist          off
bashrematch           off
nobeep                off
nobgnice              off
braceccl              off
bsdecho               off
nocaseglob            off
nocasematch           off
cbases                off
cdablevars            off
chasedots             off
chaselinks            off
nocheckjobs           off
noclobber             off
combiningchars        off
completealiases       off
completeinword        on
continueonerror       off
correct               off
correctall            off
cprecedences          off
cshjunkiehistory      off
cshjunkieloops        off
cshjunkiequotes       off
cshnullcmd            off
cshnullglob           off
nodebugbeforecmd      off
dvorak                off
emacs                 off
noequals              off
errexit               off
errreturn             off
noevallineno          off
noexec                off
extendedglob          off
extendedhistory       on
noflowcontrol         on
nofunctionargzero     off
noglob                off
noglobalexport        off
noglobalrcs           off
globassign            off
globcomplete          off
globdots              off
globsubst             off
nohashcmds            off
nohashdirs            off
hashexecutablesonly   off
nohashlistall         off
histallowclobber      off
nohistbeep            off
histexpiredupsfirst   on
histfcntllock         off
histfindnodups        off
histignorealldups     off
histignoredups        on
histignorespace       on
histlexwords          off
histnofunctions       off
histnostore           off
histreduceblanks      off
nohistsavebycopy      off
histsavenodups        off
histsubstpattern      off
histverify            on
nohup                 off
ignorebraces          off
ignoreclosebraces     off
ignoreeof             off
incappendhistory      off
interactive           on
interactivecomments   on
ksharrays             off
kshautoload           off
kshglob               off
kshoptionprint        off
kshtypeset            off
kshzerosubscript      off
nolistambiguous       off
nolistbeep            off
listpacked            off
listrowsfirst         off
nolisttypes           off
localoptions          off
localtraps            off
login                 off
longlistjobs          on
magicequalsubst       off
mailwarning           off
markdirs              off
menucomplete          off
monitor               on
nomultibyte           off
nomultifuncdef        off
nomultios             off
nonomatch             off
nonotify              off
nullglob              off
numericglobsort       off
octalzeroes           off
overstrike            off
pathdirs              off
pathscript            off
posixaliases          off
posixbuiltins         off
posixcd               off
posixidentifiers      off
posixjobs             off
posixstrings          off
posixtraps            off
printeightbit         off
printexitvalue        off
privileged            off
promptbang            off
nopromptcr            off
nopromptpercent       off
nopromptsp            off
promptsubst           on
pushdignoredups       on
pushdminus            on
pushdsilent           off
pushdtohome           off
rcexpandparam         off
rcquotes              off
norcs                 off
recexact              off
rematchpcre           off
restricted            off
rmstarsilent          off
rmstarwait            off
sharehistory          on
shfileexpansion       off
shglob                off
shinstdin             on
shnullcmd             off
shoptionletters       off
noshortloops          off
shwordsplit           off
singlecommand         off
singlelinezle         off
sourcetrace           off
sunkeyboardhack       off
transientrprompt      off
trapsasync            off
typesetsilent         off
nounset               off
verbose               off
vi                    off
warncreateglobal      off
xtrace                off
zle                   on

zsh的配置数量是169个,要比bash多得多,所以上面的截图没有全部截,只截了其中一部分。

4.3 set +o:功能因shell而异

4.3.1 在bash中 (27个)

csdn @ edu bash ~ $ set +o
set +o allexport
set -o braceexpand
set -o emacs
set +o errexit
set +o errtrace
set +o functrace
set -o hashall
set -o histexpand
set -o history
set +o ignoreeof
set -o interactive-comments
set +o keyword
set -o monitor
set +o noclobber
set +o noexec
set +o noglob
set +o nolog
set +o notify
set +o nounset
set +o onecmd
set +o physical
set +o pipefail
set +o posix
set +o privileged
set +o verbose
set +o vi
set +o xtrace

在bash中,显示的配置数量仍然为 27个,与 set -o命令一样。

4.3.2 在zsh中(20个)

csdn @edu zsh $ set +o
set -o alwaystoend
set -o autocd
set -o autopushd
set -o completeinword
set -o extendedhistory
set -o noflowcontrol
set -o histexpiredupsfirst
set -o histignoredups
set -o histignorespace
set -o histverify
set -o interactive
set -o interactivecomments
set -o longlistjobs
set -o monitor
set -o promptsubst
set -o pushdignoredups
set -o pushdminus
set -o sharehistory
set -o shinstdin
set -o zle

在zsh中,set +o命令显示的配置数量为 20个,比set -o要少得多。

对比发现,zsh中,set +o命令显示的是启用的配置,为了验证这个结论是否正确,我们先执行命令set -o nohup 把nohup启用,再来看看 set +o 命令的反馈。

csdn @ edu zsh $ set -o nohup
csdn @ edu zsh $ set +o                 
set -o alwaystoend
set -o autocd
set -o autopushd
set -o completeinword
set -o extendedhistory
set -o noflowcontrol
set -o histexpiredupsfirst
set -o histignoredups
set -o histignorespace
set -o histverify
set -o nohup
set -o interactive
set -o interactivecomments
set -o longlistjobs
set -o monitor
set -o promptsubst
set -o pushdignoredups
set -o pushdminus
set -o sharehistory
set -o shinstdin
set -o zle

由于启用的选项增加了nohup,set +o命令的反馈的配置变成了21个。

4.4 set + :功能因shell而异

4.4.1 在bash中(无反馈)

csdn @ edu bash ~ $ set +
csdn @ edu bash ~ $ 

4.4.2 在zsh中(196个)

csdn @ edu zsh $ set +
!
#
$
*
-
0
?
@
ARGC
BG
CDPATH
COLUMNS
CPUTYPE
EGID
ERRNO
EUID
FG
FIGNORE
FPATH
FX
GID
HISTCHARS
HISTCMD
HISTFILE
HISTSIZE
HOME
HOST
HOSTNAME
IFS
KEYBOARD_HACK
KEYTIMEOUT
LC_ALL
LESS
LINENO
LINES
LISTMAX
LOGCHECK
LOGNAME
LSCOLORS
LS_COLORS
MACHTYPE
MAILCHECK
MAILPATH
MANPATH
MODULE_PATH
NULLCMD
OLDPWD
OPTARG
OPTIND
OSTYPE
PAGER
PATH
POSTEDIT
PPID
PROMPT
PROMPT2
PROMPT3
PROMPT4
PS1
PS2
PS3
PS4
PSVAR
PWD
RANDOM
READNULLCMD
RPROMPT
RPROMPT2
RPS1
RPS2
SAVEHIST
SCREEN_NO
SECONDS
SHLVL
SHORT_HOST
SPROMPT
TERM
TIMEFMT
TMPPREFIX
TRY_BLOCK_ERROR
TTY
TTYIDLE
UID
USERNAME
VENDOR
WATCH
WATCHFMT
WORDCHARS
YS_VCS_PROMPT_CLEAN
YS_VCS_PROMPT_DIRTY
YS_VCS_PROMPT_PREFIX1
YS_VCS_PROMPT_PREFIX2
YS_VCS_PROMPT_SUFFIX
ZSH
ZSH_CACHE_DIR
ZSH_COMPDUMP
ZSH_CUSTOM
ZSH_EVAL_CONTEXT
ZSH_NAME
ZSH_PATCHLEVEL
ZSH_SUBSHELL
ZSH_THEME
ZSH_THEME_GIT_PROMPT_CLEAN
ZSH_THEME_GIT_PROMPT_DIRTY
ZSH_THEME_GIT_PROMPT_PREFIX
ZSH_THEME_GIT_PROMPT_SUFFIX
ZSH_THEME_RUBY_PROMPT_PREFIX
ZSH_THEME_RUBY_PROMPT_SUFFIX
ZSH_THEME_RVM_PROMPT_OPTIONS
ZSH_THEME_TERM_TAB_TITLE_IDLE
ZSH_THEME_TERM_TITLE_IDLE
ZSH_VERSION
_
_comp_assocs
_comp_dumpfile
_comp_options
_comp_setup
_compautos
_comps
_lastcomp
_patcomps
_postpatcomps
_services
aliases
argv
bg
bg_bold
bg_no_bold
bold_color
builtins
cdpath
color
colors
colour
commands
comppostfuncs
compprefuncs
custom_config_file
d
dirstack
dis_aliases
dis_builtins
dis_functions
dis_galiases
dis_reswords
dis_saliases
exit_code
fg
fg_bold
fg_no_bold
fignore
fpath
funcfiletrace
funcsourcetrace
funcstack
functions
functrace
galiases
git_info
hg_info
histchars
history
historywords
jobdirs
jobstates
jobtexts
keymaps
langinfo
mailpath
manpath
module_path
modules
nameddirs
options
parameters
path
pipestatus
plugin
plugins
precmd_functions
preexec_functions
prompt
psvar
reset_color
reswords
saliases
signals
status
termcap
terminfo
userdirs
usergroups
watch
widgets
zsh_eval_context
zsh_scheduled_events

4.5 set -o noclobber:防止文件在重定向时被重写
 

我们将执行以下面命令序列来看看noclobber在防止文件在重定向时被重写的控制效果。

 


set -o | grep noclobber # 显示当前 noclobber 的状态
echo a > a.txt          # 利用输出重定向将字符a写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
echo b > a.txt          # 利用输出重定向将字符b写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set -o noclobber        # 启用noclobber选项,防止文件在重定向时被重写
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c > a.txt          # 利用输出重定向将字符c写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c > a.txt          # 利用输出重定向将字符c写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set +o noclobber        # 取消noclobber选项
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c >> a.txt         # 利用输出重定向将字符c追加写入文件 a.txt
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容

4.5.1 直接在命令行执行 

在命令行直接输入和执行以下命令:set -o | grep noclobber;echo a > a.txt;echo -n a.txt:;cat a.txt;echo b > a.txt;echo -n a.txt:; cat a.txt;set -o noclobber;set -o | grep noclobber;echo c > a.txt; echo -n a.txt:; cat a.txt;set +o noclobber;set -o | grep noclobber;echo c >> a.txt;echo -n a.txt:;cat a.txt,效果如下:

purpleEndurer @ csdn bash ~ $ 
o | grep noclobber;echo c >> a.txt;echo -n a.txt:;cat a.txtet +o noclobber;set - 
noclobber       off
a.txt:a
a.txt:b
noclobber       on
bash: a.txt: cannot overwrite existing file
a.txt:b
noclobber       off
a.txt:b
c
purpleEndurer @ csdn bash ~ $ 

 

虽然命令执行结果是我们预期的,但命令行没有完全显示出来。

我们还是用cp /dev/stdin a.sh命令创建一个脚本文件a.sh来测试吧

4.5.2 创建脚本文件a.sh来测试

4.52.1 创建脚本文件a.sh,

  • 注意:在输入所有命令后要按Ctrl+D结束

purpleEndurer @ csdn bash ~ $ cp /dev/stdin a.sh
set -o | grep noclobber # 显示当前 noclobber 的状态
echo a > a.txt          # 利用输出重定向将字符a写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
echo b > a.txt          # 利用输出重定向将字符b写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set -o noclobber        # 启用noclobber选项,防止文件在重定向时被重写
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c > a.txt          # 利用输出重定向将字符c写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c > a.txt          # 利用输出重定向将字符c写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set +o noclobber        # 取消noclobber选项
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c >> a.txt         # 利用输出重定向将字符c追加写入文件 a.txt
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
purpleEndurer @ csdn bash ~ $ 

 4.5.2.2 查看脚本文件a.sh 的内容

purpleEndurer @ csdn bash ~ $ cat a.sh
set -o | grep noclobber # 显示当前 noclobber 的状态
echo a > a.txt          # 利用输出重定向将字符a写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
echo b > a.txt          # 利用输出重定向将字符b写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set -o noclobber        # 启用noclobber选项,防止文件在重定向时被重写
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c > a.txt          # 利用输出重定向将字符c写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c > a.txt          # 利用输出重定向将字符c写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set +o noclobber        # 取消noclobber选项
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c >> a.txt         # 利用输出重定向将字符c追加写入文件 a.txt
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
purpleEndurer @ csdn bash ~ $ 

 

4.5.2.3 执行脚本文件 a.sh

 purpleEndurer @ csdn bash ~ $ . a.sh
noclobber       off
a.txt:a
a.txt:b
noclobber       on
bash: a.txt: cannot overwrite existing file
a.txt:b
noclobber       on
bash: a.txt: cannot overwrite existing file
a.txt:b
noclobber       off
a.txt:b
c
purpleEndurer @ csdn bash ~ $ 

 

脚本开始执行时,a.txt 的内容为:

a

由于noclobber选项未启用(noclobber   off),所以 echo b > a.txt 命令执行成功,文件a.txt内容变为:

b

当命令set -o noclobber执行后,noclobber选项启用(noclobber   on),echo c > a.txt 命令未能成功执行,bash提示:a.txt: cannot overwrite existing file

当命令set +o noclobber执行后,  noclobber选项不再启用,echo c >> a.txt命令执行成功,a.txt内容变为:

b

c

在上面命令序列中

  • set -o noclobber 也可以简写为 set -C
  • set +o noclobber 也可以简写为 set +C

 

4.6 set -e:当命令返回一个非零退出状态(失败)时退出

我们在上面的a.sh文件的第1行命令后面增加两行命令:

set -e                  # 启用errexit选项,当命令返回一个非零退出状态(失败)时退出
set -o | grep errexit   # 显示当前 errexit 的状态

即:


set -o | grep noclobber # 显示当前 noclobber 的状态
set -e                  # 启用errexit选项,当命令返回一个非零退出状态(失败)时退出
set -o | grep errexit   # 显示当前 errexit 的状态
echo a > a.txt          # 利用输出重定向将字符a写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
echo b > a.txt          # 利用输出重定向将字符b写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set -o noclobber        # 启用noclobber选项,防止文件在重定向时被重写
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c > a.txt          # 利用输出重定向将字符c写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c > a.txt          # 利用输出重定向将字符c写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set +o noclobber        # 取消noclobber选项
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c >> a.txt         # 利用输出重定向将字符c追加写入文件 a.txt
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容

4.6.1 创建脚本文件a.sh

purpleEndurer @ csdn bash ~ $ cp /dev/stdin a.sh
set -o | grep noclobber # 显示当前 noclobber 的状态
set -e                  # 启用errexit选项,当命令返回一个非零退出状态(失败)时退出
set -o | grep errexit   # 显示当前 errexit 的状态
echo a > a.txt          # 利用输出重定向将字符a写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
echo b > a.txt          # 利用输出重定向将字符b写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set -o noclobber        # 启用noclobber选项,防止文件在重定向时被重写
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c > a.txt          # 利用输出重定向将字符c写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c > a.txt          # 利用输出重定向将字符c写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set +o noclobber        # 取消noclobber选项
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c >> a.txt         # 利用输出重定向将字符c追加写入文件 a.txt
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
purpleEndurer @ csdn bash ~ $ 

 

4.6.2 执行脚本文件a.sh

 purpleEndurer @ csdn bash ~ $ . a.sh
noclobber       off
errexit         on
a.txt:a
a.txt:b
noclobber       on
bash: a.txt: cannot overwrite existing file

可以看到,在命令echo c > a.txt 没能执行成功时,由于其返回值非零,脚本直接退出了。

4.7 set -x:在输出命令运行结果之前,先输出所执行的命令

为了对4.6中的例子执行情况有更直观的了解,我们在a.sh的开头增加两行命令:

set -x                  # 启用xtrace选项,在输出命令运行结果之前,先输出所执行的命令
set -o | grep xtrace    # 显示当前 xtrace 的状态

即:

set -x                  # 启用xtrace选项,在输出命令运行结果之前,先输出所执行的命令
set -o | grep xtrace    # 显示当前 xtrace 的状态
set -o | grep noclobber # 显示当前 noclobber 的状态
set -e                  # 启用errexit选项,当命令返回一个非零退出状态(失败)时退出
set -o | grep errexit   # 显示当前 errexit 的状态
echo a > a.txt          # 利用输出重定向将字符a写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
echo b > a.txt          # 利用输出重定向将字符b写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set -o noclobber        # 启用noclobber选项,防止文件在重定向时被重写
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c > a.txt          # 利用输出重定向将字符c写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c > a.txt          # 利用输出重定向将字符c写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set +o noclobber        # 取消noclobber选项
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c >> a.txt         # 利用输出重定向将字符c追加写入文件 a.txt
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容

4.7.1 创建脚本文件a.sh 

purpleEndurer @ csdn bash ~ $ cp /dev/stdin a.sh
set -x                  # 启用xtrace选项,在输出命令运行结果之前,先输出所执行的命令
set -o | grep xtrace    # 显示当前 xtrace 的状态
set -o | grep noclobber # 显示当前 noclobber 的状态
set -e                  # 启用errexit选项,当命令返回一个非零退出状态(失败)时退出
set -o | grep errexit   # 显示当前 errexit 的状态
echo a > a.txt          # 利用输出重定向将字符a写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
echo b > a.txt          # 利用输出重定向将字符b写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set -o noclobber        # 启用noclobber选项,防止文件在重定向时被重写
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c > a.txt          # 利用输出重定向将字符c写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c > a.txt          # 利用输出重定向将字符c写入文件 a.txt  
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容
set +o noclobber        # 取消noclobber选项
set -o | grep noclobber # 显示当前 noclobber 的状态
echo c >> a.txt         # 利用输出重定向将字符c追加写入文件 a.txt
echo -n a.txt:          # 输出提示 a.txt:
cat a.txt               # 显示文件a.txt的内容

 

4.7.2 执行脚本文件a.sh

purpleEndurer @ csdn bash ~ $ . a.sh
++ set -o
++ grep --color=auto xtrace
xtrace          on
++ grep --color=auto noclobber
++ set -o
noclobber       off
++ set -e
++ grep --color=auto errexit
++ set -o
errexit         on
++ echo a
++ echo -n a.txt:
a.txt:++ cat a.txt
a
++ echo b
++ echo -n a.txt:
a.txt:++ cat a.txt
b
++ set -o noclobber
++ grep --color=auto noclobber
++ set -o
noclobber       on
++ echo c
bash: a.txt: cannot overwrite existing file
 

 

启用了 xtrace选项后,我们可以直观地看到脚本在执行echo c > a.txt 命令没有成功后退出。

4.8 set -u:当执行时使用到未定义过的变量,则显示错误信息。

purpleEndurer @ csdn bash ~ $ cp /dev/stdin a.sh
set -x                  # 启用xtrace选项,在输出命令运行结果之前,先输出所执行的命令
set -o | grep xtrace    # 显示当前 xtrace 的状态
set -o | grep nounse    # 显示当前 nounset 的状态
b=b                     # 定义变量b,并初始化其值为b
echo a=$a               # 显示变量a
echo b=$b               # 显示变量b
set -u                  # 启用nounset选项,当执行时使用到未定义过的变量时,则显示错误信息
set -o | grep nounse # 显示当前 nounset 的状态
echo a=$a               # 显示变量a
echo b=$b               # 显示变量b
purpleEndurer @ csdn bash ~ $ . a.sh
++ grep --color=auto xtrace
++ set -o
xtrace          on
++ set -o
++ grep --color=auto nounse
nounset         off
++ b=b
++ echo a=
a=
++ echo b=b
b=b
++ set -u
++ grep --color=auto nounse
++ set -o
nounset         on
bash: a: unbound variable
++ echo b=b
b=b
bash: USER: unbound variable
purpleEndurer @ csdn bash ~ $ ~

bash默认 nounset选项是未启用的,所以尽管并没有定义变量a,在执行命令echo a=$a时没出错信息,而是显示:a=

当我们执行命令set -u , 启用nounset选项后,再次执行命令echo a=$a时,显示了出错信息:bash: a: unbound variable

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/170285.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Bean实例化的基本流程

Spring容器在进行初始化时&#xff0c;会将xml配置的<bean>的信息封装成一个BeanDefintion对象&#xff0c;所有的BeanDefintion存储到BeanDefintionMap的Map集合中去&#xff0c;Spring框架对该Map进行遍历&#xff0c;使用反射创建Bean实例对象&#xff0c;创建好的Bea…

以“防方视角”观Shiro反序列化漏洞

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 案例概述02 攻击路径03 防方思路 01 案例概述 这篇文章来自微信公众号“潇湘信安”&#xff0c;记录的某师傅如何发现、利用Shiro反序列化漏洞&#xff0c;又是怎样绕过火绒安全防护实现文件落地、…

Leetcode刷题详解——删除并获得点数

1. 题目链接&#xff1a;740. 删除并获得点数 2. 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;你可以对它进行一些操作。 每次操作中&#xff0c;选择任意一个 nums[i] &#xff0c;删除它并获得 nums[i] 的点数。之后&#xff0c;你必须删除 所有 等于 nums[i] …

github 开源whisper ros llm

GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak Supervision openai whisper ROS LLM https://github.com/Auromix/ROS-LLM/tree/ros2-humble/llm_input

Pandas数据集的合并与连接merge()方法_Python数据分析与可视化

数据集的合并与连接 merge()解析merge()的主要参数 merge()解析 merge()可根据一个或者多个键将不同的DataFrame连接在一起&#xff0c;类似于SQL数据库中的合并操作。 数据连接的类型 一对一的连接&#xff1a; df1 pd.DataFrame({employee: [Bob, Jake, Lisa, Sue], grou…

Vue移动 HTML 元素到指定位置 teleport 标签

teleport 标签&#xff1a;用于将组件中的 HTML 元素移动到任意的位置。 使用 teleport 标签移动 HTML 元素&#xff1a; <!-- 将 teleport 中的内容移动到 body 标签中 --> <teleport to"body"><div><h3>我是第三层组件的标题</h3>…

【练习】检测U盘并自动复制内容到电脑的软件

软件作用&#xff1a; 有U盘插在电脑上后&#xff0c;程序会检测到U盘的路径。 自己可以提前设置一个保存复制文件的路径或者使用为默认保存的复制路径&#xff08;默认为桌面&#xff0c;可自行修改&#xff09;。 检测到U盘后程序就会把U盘的文件复制到电脑对应的…

初刷leetcode题目(5)——数据结构与算法

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

如何使用http来获取thingsbord中的设备数据

背景 有个读者问我,他想做tb的二次开发,想要通过一个接口来查询设备的遥测数据。 于是我给他写了这篇文章。 具体实现 由于他使用的是cloud版本,于是我使用cloud来做演示 文档的接口 https://thingsboard.cloud/swagger-ui/#/telemetry-controller/getTimeseriesUsing…

day15-Linux对文件系统的支持

1.Linux中使用文件系统分几个部分 1.1 有关于Linux中高速缓冲区的管理程序。 分页机制 buffer.c 1.2 文件系统的底层通用函数(对于硬盘的读写 分配 释放等&#xff0c;对于目录的节点管理 inode 内存与磁盘的映射) 1.3 对文件数据进行读写操作模块 (VFS&#xff1a;虚拟文件系统…

数据结构:枚举

概念 枚举主要用途是&#xff1a;将一组常量组织起来&#xff0c;在这之前表示一组常量通常使用定义常量的方式&#xff1a; 比如下面的例子&#xff1a; public static final int RED 1; public static final int GREEN 2; public static final int BLACK 3; 利用常量…

Re50:读论文 Large Language Models Struggle to Learn Long-Tail Knowledge

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称&#xff1a;Large Language Models Struggle to Learn Long-Tail Knowledge ArXiv网址&#xff1a;https://arxiv.org/abs/2211.08411 官方GitHub项目&#xff08;代码和实体&#xff09;&#xf…

python note

Python 基本操作 &#xff08;赋值、分支及循环语句、使用 import 导入库&#xff09;&#xff1b; Python 的 With 语句 &#xff1b; NumPy &#xff0c;Python 下常用的科学计算库。TensorFlow 与之结合紧密&#xff1b; 向量 和 矩阵 运算&#xff08;矩阵的加减法、矩阵…

基于安卓android微信小程序的好物分享系统

运行环境 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&a…

【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.了解项目功能 在本次项目中我们的目标是实现一个带头双向循环链表: 该带头双向循环链表使用动态内存分配空间,可以用来存储任意数量的同类型数据. 带头双向循环链表结点(No…

全志H616开发版

开发板介绍&#xff1a; 二、开发板刷机 SDFormatter TF卡的格式化工具、Win32Diskimager 刷机工具 刷机镜像为&#xff1a;Orangepizero2_2.2.0_ubuntu_bionic_desktop_linux4.9.170.img 使用MobaXterm_Personal_20.3连接使用 网络配置&#xff1a;nmcli dev wifi 命令接入网…

【机器学习】034_多层感知机Part.2_从零实现多层感知机

一、解决XOR问题 1. 回顾XOR问题&#xff1a; 如图&#xff0c;如何对XOR面进行分割以划分四个输入 对应的输出 呢&#xff1f; 思路&#xff1a;采用两个分类器分类&#xff0c;每次分出两个输入 &#xff0c;再借助这两个分类从而分出 。 即采用同或运算&#xff0c;当两…

Redis轻松添加从节点:零阻塞、零烦恼,系统性能再飙升

点击上方蓝字关注我 生成环境的Redis有时需要替换或添加从节点&#xff0c;如果此时主库较大&#xff0c;添加从节点时将可能因为主节点在做bgsave数据备份时使得主库压力大&#xff0c;从而引起其他操作变慢&#xff0c;进而出现阻塞等操作。那么有什么方法可以尽最大程度地减…

C语言中的指针(上)

目录 一、基本概念 1.变量的存储空间 2.定义指针 3.引用与解引用 二、指针的算术运算、类型以及通用指针 1.指针的算数运算 2.指针类型以及通用型指针 三、指向指针的指针&#xff08;pointers to pointers&#xff09; 四、函数传值以及传引用 1.局部变量 2.从存储地…

【ctfshow】web入门-信息搜集-web21~28

SSS web21_爆破什么的&#xff0c;都是基操web22_域名也可以爆破的&#xff0c;试试爆破这个ctf.show的子域名web23_还爆破&#xff1f;这么多代码&#xff0c;告辞&#xff01;web24_爆个&#x1f528;web25_爆个&#x1f528;&#xff0c;不爆了web26_这个可以爆web27_CTFsho…