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.mzph.cn/news/153095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一道简单的积分题目

题目如下图&#xff1a; 解法1&#xff1a; 解法2&#xff1a; 解法3&#xff1a; 错误做法&#xff1a; 在 x ∈ ( 0 , ∞ ) 上有 ln ⁡ x < x &#xff0c;令 f ( x ) ln ⁡ x 1 x 2 &#xff0c; g ( x ) &#xff1d; x 1 x 2 ∴ f ( x ) < g ( x ) &#x…

Qt按钮大全续集(QCommandLinkButton和QDialogButtonBox )

## QCommandLinkButton 控件简介 QCommandLinkButton 控件中文名是“命令链接按钮”。QCommandLinkButton 继承QPushButton。CommandLinkButton 控件和 RadioButton 相似,都是用于在互斥选项中选择一项。表面上同平面按钮一样,但是 CommandLinkButton 除带有正常的按钮上的文…

SpringCloud之Feign

文章目录 前言一、Feign的介绍二、定义和使用Feign客户端1、导入依赖2、添加EnableFeignClients注解3、编写FeignClient接口4、用Feign客户端代替RestTemplate 三、自定义Feign的配置1、配置文件方式全局生效局部生效 2、java代码方式 四、Feign的性能优化连接池配置 五、Feign…

代码随想录算法训练营第六十天丨 单调栈03

84.柱状图中最大的矩形 思路 单调栈 本地单调栈的解法和接雨水的题目是遥相呼应的。 为什么这么说呢&#xff0c;42. 接雨水 (opens new window)是找每个柱子左右两边第一个大于该柱子高度的柱子&#xff0c;而本题是找每个柱子左右两边第一个小于该柱子的柱子。 这里就涉…

从入门到精通,mac电脑录屏软件使用教程!

“mac电脑怎么录屏呀&#xff0c;刚买了一台mac电脑&#xff0c;用了几个月感觉挺流畅的&#xff0c;最近因为工作原因&#xff0c;需要用到录屏功能&#xff0c;但是我不会操作&#xff0c;想问问大家有没有简单易懂的录屏教程&#xff0c;谢谢啦。” 在日常生活中&#xff0…

几个强力的nodejs库

几个强力的nodejs库 nodejs被视为许多Web开发人员的理想运行时环境。 nodejs的设计是为了在运行时中使用JavaScript编写的代码&#xff0c;它是世界上最流行的编程语言之一&#xff0c;并允许广泛的开发者社区构建服务器端应用程序。 nodejs提供了通过JavaScript库重用代码的…

FastJsonAPI

maven项目 pom.xml <dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.26</version></dependency><dependency><groupId>junit</groupId>&l…

Java读写Jar

Java提供了读写jar的类库Java.util.jar&#xff0c;Java获取解析jar包的工具类如下&#xff1a; import java.io.File; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; import java.util.HashMap; import …

【图像分类】【深度学习】【Pytorch版本】ResNet模型算法详解

【图像分类】【深度学习】【Pytorch版本】 ResNet模型算法详解 文章目录 【图像分类】【深度学习】【Pytorch版本】 ResNet模型算法详解前言ResNet讲解Deep residual learning framework(深度残差学习框架)残差结构(Residuals)ResNet模型结构 ResNet Pytorch代码完整代码总结 前…

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

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

PyTorch微调终极指南1:预训练模型调整

如今&#xff0c;在训练深度学习模型时&#xff0c;通过根据自己的数据微调预训练模型来进行迁移学习&#xff08;transfer learning&#xff09;已成为首选方法。 通过微调这些模型&#xff0c;我们可以利用他们的专业知识并使它们适应我们的特定任务&#xff0c;从而节省宝贵…

【miniQMT实盘量化4】获取实时行情数据

前言 上篇&#xff0c;我们介绍了如何获取历史数据&#xff0c;有了历史数据&#xff0c;我们可以进行分析和回测。但&#xff0c;下一步&#xff0c;我们更需要的是实时数据&#xff0c;只有能有效的监控实时行情数据&#xff0c;才能让我们变成市场上的“千里眼&#xff0c;…

从0开始学习JavaScript--深入探究JavaScript类型化数组

JavaScript类型化数组是一种特殊的数组类型&#xff0c;引入了对二进制数据的更底层的操作。这种数组提供了对内存中的二进制数据直接进行读写的能力&#xff0c;为处理图形、音频、视频等大规模数据提供了高效的手段。本文将深入探讨JavaScript类型化数组的基本概念、常见类型…

场景交互与场景漫游-对象选取(8-2)

对象选取示例的代码如程序清单8-11所示&#xff1a; /******************************************* 对象选取示例 *************************************/ // 对象选取事件处理器 class PickHandler :public osgGA::GUIEventHandler { public:PickHandler() :_mx(0.0f), _my…

48. 旋转图像

给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&…

用平板当电脑副屏(spacedesk)双端分享

文章目录 1.准备工作2.操作流程1. 打开spacedesk点击2. 勾选USB Cable Android3. 用数据线连接移动端和pc端&#xff0c;选择仅充电4. 打开安装好的spacedesk 记得在win系统中设置扩展显示器&#xff1a; 1.准备工作 下载软件spacedesk Driver Console pc端&#xff1a; 移动…

macos苹果电脑清理软件有哪些?cleanmymac和腾讯柠檬哪个好

MacOS是一款优秀的操作系统&#xff0c;但是随着使用时间的增加&#xff0c;它也会产生一些不必要的垃圾文件&#xff0c;占用磁盘空间和内存资源&#xff0c;影响系统的性能和稳定性。为了保持MacOS的清洁和高效&#xff0c;我们需要使用一些专业的清理软件来定期扫描和清除这…

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

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

【Linux】:体系结构与进程概念

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux体系结构和进程的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入…

腾讯云轻量数据库1核1G性能测评、租用费用和详细介绍

腾讯云轻量数据库服务采用腾讯云自研的新一代云原生数据库 TDSQL-C&#xff0c;融合了传统数据库、云计算与新硬件技术的优势&#xff0c;100%兼容 MySQL&#xff0c;实现超百万级 QPS 的高吞吐&#xff0c;128TB 海量分布式智能存储&#xff0c;保障数据安全可靠。腾讯云百科t…