前面提到过内置命令set,它可以显示当前shell的所有变量,还可以重新设置位置参数。set的更重要的作用是设置当前shell的选项,3.9.3节提到了其中的一个选项。
命令set-o的输出有两列,分别为选项名和相应的开关状态,off表示状态为关闭,on表示状态为打开。只关心某一个选项是开还是关的话,可用grep命令过滤它,如:
查询某个选项的开关状态,还有一种方法,格式为:
条件判断命令的退出状态为0时,表示选项是开着的,为非0时,表示选项是关闭的。例如,判断allexport是否打开的脚本可以这样写:
set-o后面跟选项,即可打开该选项:
set+o后面跟选项,则关闭该选项:
很多选项有快捷方式。如命令set -a的作用是打开allexport,相当于set -o allexport:
set +a的作用是关闭allexport,相当于set +o allexport。set命令可以控制的主要选项见表10-2。
表10-2 命令set的选项
(续)
表中的选项较多,不一一讲解了,仅选择几个讲解一下。
解释一下选项allexport的作用。如果打开了allexport,在当前的shell中定义了一个新变量或者修改一个老变量时,该变量会自动被导出。默认地,选项allexport是关闭的,需执行export命令才能导出变量。
举例讲一下选项errexit的作用。一个脚本当中某条命令失败了,后面的命令默认会照常执行。例如,脚本errexit_1.sh的第三行是一条错误命令:(www.xing528.com)
运行errexit_1.sh,脚本的第3行出错,但是第4行命令照常执行:
在上面的脚本中增加set-e命令,就是打开选项errexit,得到脚本errexit_2.sh:
执行errexit_2.sh,运行到出错的地方,脚本就停止了,后面的命令不再执行:
选项noglob打开后则关闭路径名与文件名的通配符(noglobbing)。命令ls*默认是用来显示当前目录下所有的非隐藏文件和目录,打开选项noglob后,就不是这样了:
打开选项noglob后,在ls*命令里,*不再是通配符,命令ls*试图列出名字就叫*的文件。这时可以产生一个名字就叫*的文件:
在一个shellTerminal里面,按〈Ctrl+D〉键,shell就退出了。打开选项ignoreeof后,按〈Ctrl+〉键,shell窗口不会关闭,而得到“用exit离开shell”的系统提示,这时可用exit命令退出shell:
选项histexpand默认是打开的,例如,!n表示历史命令中的第n条命令,!-n表示倒数第n条,!!表示最后一条(与!-1相同),!string表示以string开头的离现在最近的历史命令。
例如,先运行HISTIGNORE=history,确保命令history本身不被记入命令历史中(见表4-3),再运行history-c清空原有的历史命令。然后,依次执行ls,pwd,date,uname和whoami命令,现在命令历史如下:
!!表示最后一条命令whoami,!3表示第3条命令date,!un表示以un开头的命令uname:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。