使用set命令可以设置各种shell选项或者列出shell变量.单个选项设置常用的特性. 在某些选项之后-o参数将特殊特性打开.在某些选项之后使用+o参数将关闭某些特性, 不带任何参数的set命令将显示shell的全部变量.除非遇到非法的选项,否则set总是返回ture.
成都创新互联公司作为成都网站建设公司,专注网站建设、网站设计,有关成都定制网页设计方案、改版、费用等问题,行业涉及橡塑保温等多个领域,已为上千家企业服务,得到了客户的尊重与认可。
当BASH shell被调用时,可以列出全部的选项.当前的选项集列在$-中.在option参数被处理后,其他的参数被赋值到位置参数中(,,...,$n)
格式
set [--abefhkmnptuvxldCHP] [-o option name] [arguments ...]
详解:
选项 说明
-a 自动向已经修改的变量或为导出后序命令的变量作出标志
-b 不是在原提示符之前,而是立即引发终止后台任务的状态表
-e 如果命令带非零值返回,立即退出 -
f 禁止带扩展名的路径
-h 定义函数时,定位和存储函数命令,当函数被执行时,通常查询 函数命令
-k 所有的关键词参数,而不只是那些命令名前的关键词参数,被放 在环境命令中
-m 监视器模式,启动任务控制.此选项默认支持系统shell交互.后 台进程以单独的进程组运行,在每次完成任务时显示包含退出的 状态行
-n 读取命令但不执行命令.通常监查shell脚本的句法错误.交互 shell被忽略
-o option-name 选项名可以是下列之一:
选项 说明
allexport 同-a选项
braceexpand shell执行花括号扩展,在默认情况下起作用
emacs 使用emacs风格命令行编辑接口.除非shell以-noline-editing 选项启动,否则当shell交互时,通过默认启动该选项
errexit 同-e选项
histexpand 同-H选项
ignoreeof 其结果是好像shell命令IGNOREEOF=10被执行
interactive 允许单词前带#号,以使得在交互shell中忽略命令行的全部字符
-commands
monitor 同-m选项
noclobber 同-C选项
noexec 同-n选项
noglob 同-f选项
nohash 同-d选项
notify 同-b选项
nounset 同-u选项
physical 同-p选项
posix 改变BASH属性以匹配标准,默认操作不同于POSIX1003.2标准
verbose 同-v选项
vi 使用vi风格的命令行编辑器
XTRACE 同-x选项,如果没有给出选项名,显示当前选项值
-p 打开特权模式(在此模式,$ENV文件被处理,不能从环境中继承 shell函数.如果是有效用户ID而不是实用户组则自动启动.关闭 此选项将使得有效用户和组IDs设置实用户和组IDs)
-t 在读取命令并执行之后退出
-u 当执行参数括展时,把非设置变量作为错误处理(如果扩展企图 出现在非设置变量中,shell显示错误信息.如果不是交互式,则 带非凌值退出)
-v 输入行被读取时,显示shell输入行
-x 在每个简单命令被扩展之后,显示PS4扩展值,之后是要执行的命令
-l 保存和恢复绑定在命令中的名称
-d 禁止执行查找散列命令(通常,命令被保存在散列表中,一旦被找到 就不再继续查找)
-C 效果好像是执行了noclobber=shell命令
-H 使用!风格的历史替代(当shell交互时,在默认情况下,此选项有效)
-P 如果设置此参数,当执行改变目录命令cd时,不遵循符号链接,而是 使用实际的目录
-- 如果在选项后没有参数,不设置位置参数.否则,即使一些参数以a 选项开始,也要把位置参数设置为argument
- 结束选项的信号,将引发其余的参数被赋值到位置参数中(-x和-v 选项被关闭.如果没有argument,位置参数将保留未改变的参数)
Linux里面set -e命令作用是,如果一个命令返回一个非0退出状态值(失败),就退出.
这个命令-e参数企业应用极少
set的“+” ,"-" 分别用于关闭或者打开某些特性;具体的特性有很多,这里介绍 -e 特性:
set -e ; 表示后续所有的bash 命令的返回code 如果不是0,那么脚本立即退出,后续的脚本将不会得到执行的机会;
set +e ; 这个是默认的状态,表示就算后续的命令如果返回值不是0,那么脚本依然向下执行;
所以 set -e其实就是从设置的位置起,给脚本的每一条命令加上了同一个退出条件;而set +e 则是取消这种设置;
看下面的例子:
[root@oldboy ~]# cat test.sh
#!/bin/bash
function lookupstr(){
grep "sles" /etc/os-release /dev/null 21
if [ "$?" -ne 0 ];then
echo -e "Can not find the 'sles' string in file.\n"
fi
}
echo "Below results based on: set +e"
set +e
lookupstr
echo "Below results based on: set -e"
set -e
lookupstr
[root@oldboy ~]# ./test.sh
Below results based on: set +e
Can not find the 'sles' string in file.
Below results based on: set -e
[root@oldboy ~]#
set -e option 可以帮助优化脚本
Linux系统设置:set命令详解
set命令作⽤主要是显⽰系统中已经存在的shell变量,以及设置shell变量的新变量值。使⽤set更改shell特性时,符号"+"和"-"的作⽤分别是打开和关闭指定的模式。set命令不能够定义新的shell变量。如果要定义新的变量,可以使⽤命令以变量名=值的格式进⾏定义即可。
语法
set(选项)(参数)
选项
-a:标⽰已修改的变量,以供输出⾄环境变量。
-b:使被中⽌的后台程序⽴刻回报执⾏状态。
-C:转向所产⽣的⽂件⽆法覆盖已存在的⽂件。
-d:Shell预设会⽤杂凑表记忆使⽤过的指令,以加速指令的执⾏。使⽤-d参数可取消。
-e:若指令传回值不等于0,则⽴即退出shell。
-f:取消使⽤通配符。
-h:⾃动记录函数的所在位置。
-H Shell:可利⽤"!"加指令编号的⽅式来执⾏history中记录的指令。
-k:指令所给的参数都会被视为此指令的环境变量。
-l:记录for循环的变量名称。
-m:使⽤监视模式。
-n:只读取指令,⽽不实际执⾏。
-p:启动优先顺序模式。
-P:启动-P参数后,执⾏指令时,会以实际的⽂件或⽬录来取代符号连接。
-t:执⾏完随后的指令,即退出shell。
-u:当执⾏时使⽤到未定义过的变量,则显⽰错误信息。
-v:显⽰shell所读取的输⼊值。
-x:执⾏指令后,会先显⽰该指令及所下的参数。
参数
取消某个set曾启动的参数。
实例
使⽤declare命令定义⼀个新的环境变量"mylove",并且将其值设置为"Visual C++",输⼊如下命令:
declare mylove='Visual C++' #定义新环境变量
再使⽤set命令将新定义的变量输出为环境变量,输⼊如下命令:
set -a mylove #设置为环境变量
执⾏该命令后,将会新添加对应的环境变量。⽤户可以使⽤命令和命令分别显⽰和搜索环境变量"mylove",输⼊命令如下:
env | grep mylove #显⽰环境变量值
此时,该命令执⾏后,将输出查询到的环境变量值。
¥
5.9
百度文库VIP限时优惠现在开通,立享6亿+VIP内容
立即获取
Linux系统设置:set命令详解
Linux系统设置:set命令详解
set命令作⽤主要是显⽰系统中已经存在的shell变量,以及设置shell变量的新变量值。使⽤set更改shell特性时,符号"+"和"-"的作⽤分别是打开和关闭指定的模式。set命令不能够定义新的shell变量。如果要定义新的变量,可以使⽤命令以变量名=值的格式进⾏定义即可。
语法
set(选项)(参数)
选项
-a:标⽰已修改的变量,以供输出⾄环境变量。
第 1 页
-b:使被中⽌的后台程序⽴刻回报执⾏状态。
-C:转向所产⽣的⽂件⽆法覆盖已存在的⽂件。
-d:Shell预设会⽤杂凑表记忆使⽤过的指令,以加速指令的执⾏。使⽤-d参数可取消。
-e:若指令传回值不等于0,则⽴即退出shell。
-f:取消使⽤通配符。
-h:⾃动记录函数的所在位置。
-H Shell:可利⽤"!"加指令编号的⽅式来执⾏history中记录的指令。
第 2 页
-k:指令所给的参数都会被视为此指令的环境变量。
-l:记录for循环的变量名称。
-m:使⽤监视模式。
-n:只读取指令,⽽不实际执⾏。
-p:启动优先顺序模式。
-P:启动-P参数后,执⾏指令时,会以实际的⽂件或⽬录来取代符号连接。
-t:执⾏完随后的指令,即退出shell。
-u:当执⾏时使⽤到未定义过的变量,则显⽰错误信息。
第 3 页
-v:显⽰shell所读取的输⼊值。
-x:执⾏指令后,会先显⽰该指令及所下的参数。
参数
取消某个set曾启动的参数。
实例
使⽤declare命令定义⼀个新的环境变量"mylove",并且将其值设置为"Visual C++",输⼊如下命令:
declare mylove='Visual C++' #定义新环境变量
第 4 页
再使⽤set命令将新定义的变量输出为环境变量,输⼊如下命令:
set -a mylove #设置为环境变量
执⾏该命令后,将会新添加对应的环境变量。⽤户可以使⽤命令和命令分别显⽰和搜索环境变量"mylove",输⼊命令如下:
env | grep mylove #显⽰环境变量值
此时,该命令执⾏后,将输出查询到的环境变量值。
上周刚经历了一个“删库跑路”的惨重事件,不知哪位无邪的童鞋把Confluence 的数据存储目录 /var 清空了,结果群众的怒火燃烧上了天空
这次结合自己的一些思考来记录一些有关脚本安全的点
先来看一个简单的案例
在用户主目录下创建safe目录及相关文件用于测试演示
假如写一段脚本删除safe目录下所有文件:
这段是不是看起来没有问题,但如果由于有些大心脏的同学粗心,写成下面这样
最终,脚本都变成了rm -rf * ,可怕至极
其实在shell脚本当中,为了防止这种现象,我们可以借助set 命令来实现相关控制
关于set 命令有较多参数,这里介绍最常用的几个
我们以刚才图4那段有问题的脚本说事
为保证不错删东西 ,我们加一个set -u 选项 ,判断变量是否存在
我们执行一下,看看效果
看,报错啦,dir这个变量没有声明,ls 查看一下文件,发现都还存在
set -e 与set -u 通常搭配在一起使用
一个是遇到错误退出,一个是发现空变量报错
这两个搭配在一起放在脚本里可以防止一些变量为空导致文件全被清空的问题
拓展一下:
如果只想应用在脚本的某一段中,那么
开始段落前加set -e 表示范围开始
结束段落后加 set +e 表示范围结束
set -x 与set + x同理。
1、删文件其实不用rm -rf ,不是受迫性需要,不要使用rm -rf
2、修改、删除系统文件或其他重要的东西,先备份一份
3、非特殊需要,不建议在root下操作,普通用户即可
4、脚本加上set -e 与set -u保证安全