`
字符串
  • 浏览: 36167 次
文章分类
社区版块
存档分类
最新评论

linux中的set命令

 
阅读更多

1. set -e
set命令的-e参数,linux自带的说明如下:
"Exit immediately if a simple command exits with a non-zero status."
也就是说,在"set -e"之后出现的代码,一旦出现了返回值非零,整个脚本就会立即退出。有的人喜欢使用这个参数,是出于保证代码安全性的考虑。但有的时候,这种美好的初衷,也会导致严重的问题。

真实案例:
脚本a.sh开头使用了"set -e",且能正常运行。在几个月或更久以后,因需求升级,在脚本中增加了3行hadoop操作:
#!/bin/bash
set -e
...
/home/work/.../hadoop dfs -rmr /app/.../dir
/home/work/.../hadoop dfs -mkdir /app/.../dir
/home/work/.../hadoop dfs -put file_1 /app/.../dir/
...
这几行hadoop命令逻辑很简单:在hdfs上清除并新建一个目录,并将一份本地文件推送至这个目录,供后续使用。将这几行单拎出来,在命令行下执行,除了提示待删除的目录不存在,并没有什么问题,文件还是会被推送到指定的地方。

但第一次执行这个脚本的时候,却失败退出了,且导致调用该脚本的程序整体退出,造成了严重的后果。原因是hdfs上还没有这个目录,rmr这一行会返回255,这个值被脚本前方的"set -e"捕捉到,直接导致了脚本退出。

新增的代码本身并没有问题,先删除再新建目录,反而是保证数据安全的比较规范的操作,删除命令本身的容错性,可以保证后续命令正常执行。事实是这个脚本有好几百行,且逻辑比较复杂,在增加这几行代码的时候,开发人员已经不记得这个脚本里还有个"set -e"埋伏着了。

可见设置"set -e",在脚本开发过程中可能很有帮助,而在开发完成后,特别是对于后期可能有升级的脚本,则可能是埋下了安全隐患。

2. set -o pipefail
对于set命令-o参数的pipefail选项,linux是这样解释的:
"If set, the return value of a pipeline is the value of the last (rightmost) command to exit with a non-zero status,or zero if all commands in the pipeline exit successfully. This option is disabled by default."

设置了这个选项以后,包含管道命令的语句的返回值,会变成最后一个返回非零的管道命令的返回值。听起来比较绕,其实也很简单:

# test.sh
set -o pipefail
ls ./a.txt |echo "hi" >/dev/null
echo $?

运行test.sh,因为当前目录并不存在a.txt文件,输出:
ls: ./a.txt: No such file or directory
1 #设置了set -o pipefail,返回从右往左第一个非零返回值,即ls的返回值1

注释掉set -o pipefail这一行,再次运行,输出:
ls: ./a.txt: No such file or directory
0 # 没有set -o pipefail,默认返回最后一个管道命令的返回值

分享到:
评论

相关推荐

    Linux命令模板 licote 1.2.2

    用于快速编写一个linux环境的命令程序,当然如果你愿意,你可以用于任何程序中;Licote的主要任务就是帮助你解析linux环境下的常用命令选项,让你快速的编写命令程序的同时,为用户提供灵活而强大的使用方法; ...

    Linux set命令用法详解

    Linux set命令 Linux set命令用于设置shell。 set指令能设置所使用shell的执行方式,可依照不同的需求来做设置。 语法set [+-abCdefhHklmnpPtuvx] 参数说明: -a 标示已修改的变量,以供输出至环境变量。 -b 使被...

    linux设置shell命令—–set

    Linux set命令用于设置shell。 set指令能设置所使用shell的执行方式,可依照不同的需求来做设置。 语法 set 【选项】 【参数】 选项 -a:标示已修改的变量,以供输出至环境变量 -b:使被中止的后台程序立刻回报...

    linux中ipset命令的使用方法详解

    ipset是linux kernel的一个功能,可以将ip等组合成一个ipset,在iptables中可以直接指定ip...下面这篇文章主要给大家介绍了关于linux中ipset命令的使用方法,文中介绍的非常详细,需要的朋友们下面来一起学习学习吧。

    linux服务器命令下发邮件设置

    linux服务器命令下发邮件设置linux服务器命令下发邮件设置linux服务器命令下发邮件设置

    Linux命令模板 licote 1.2.1

    用于快速编写一个linux环境的命令程序,当然如果你愿意,你可以用于任何程序中;Licote的主要任务就是帮助你解析linux环境下的常用命令选项,让你快速的编写命令程序的同时,为用户提供灵活而强大的使用方法; ...

    Linux文本编辑器命令大全

    Linux下的文本编辑器有很多种,vi 是最常用的,也是各版本Linux的标配。注意,vi 仅仅是一个文本编辑器,可以给字符着色,可以自动补全,但是不像 Windows 下的 word 有排版功能。 · 所有版本的 Linux 都带有 vi ...

    Linux环境变量命令说明

    Set env export linux环境变量

    Linux命令模板 licote 1.2.3

    用于快速编写一个linux环境的命令程序,当然如果你愿意,你可以用于任何程序中;Licote的主要任务就是帮助你解析linux环境下的常用命令选项,让你快速的编写命令程序的同时,为用户提供灵活而强大的使用方法; ...

    Linux Command Set For Developer 一个小时搞定所有的开发者必备Linux命令.zip

    嵌入式linux开发

    cmd操作命令和linux命令大全收集

    fc one.txt two.txt > 3st.txt 对比二个文件并把不同之处输出到3st.txt文件中,"> "和"> >" 是重定向命令 at id号 开启已注册的某个计划任务 at /delete 停止所有计划任务,用参数/yes则不需要确认就直接停止 at ...

    linux vi 常用命令

    linux vi 常用命令 命令行模式(command mode)功能键 1). 插入模式 按「i」切换进入插入模式「insert mode」,按"i"进入插入模式后是从光标当前位置开始输入文件; 按「a」进入插入模式后,是从目前光标所在位置...

    Linux命令大全完整版

    Linux命令大全完整版 目 录 目 录 I 1. linux系统管理命令 1 adduser 1 chfn(change finger information) 1 chsh(change shell) 1 date 2 exit 3 finger 4 free 5 fwhois 5 gitps(gnu interactive tools ...

    vi命令下set的用法

    set autoindent set list set number set readonly等用法 包含vi基础命令及其用法介绍 vi编辑器里面包括了定制vi会话的操作

    Linux命令搜索工具linux-command.zip

    Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。   Linux命令分类 这里存放Linux 命令大全并不全,你可以通过linux-command来搜索,它是把 command 目录里面搜集的...

    linux修改命令行样式.md

    要修改linux终端命令行颜色,我们需要用到PS1,PS1是Linux终端用户的一个环境变量,用来说明命令行提示符的设置。在终端输入命令:#set,即可在输出中找到关于PS1的定义如下:

    linux 之history命令用法

    汇总部分history用法,其中包括输入带时间格式history内容,以及history中保存的命令的再次调用的方法等等

    Linux 常用命令(xls 文件)非常实用

    Linux 常用命令(xls 文件)非常实用 networking (Note ifconfig, route, mii-tool, nslookup commands are obsolete) • ip link show List interfaces ethtool interface List interface status ip link set ...

Global site tag (gtag.js) - Google Analytics