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

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开发常用命令.doc

    作为 Linux 开发者,掌握基本的命令操作是非常重要的,本文将对 Linux 开发中常用的命令进行总结和说明。 一、目录操作命令 在 Linux 中,目录操作命令是最基本也是最常用的命令之一。下面都是目录操作命令: * ...

    Linux命令模板 licote 1.2.2

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

    linux-set-start.rar_linux 开机启动

    在Linux系统中,设置服务开机启动是管理后台进程和服务生命周期的重要环节。这涉及到对系统启动流程的理解、系统初始化脚本的编写以及使用特定工具来控制服务的行为。在本主题中,我们将深入探讨如何在Linux环境下...

    vi命令下set的用法

    `vi`命令是Linux系统中常用的文本编辑器,它的全称是`Vim`(Vi Improved),具有强大的编辑功能和高度可配置性。在`vi`中,`set`命令用于配置编辑器的行为和设置。这里我们将深入探讨`set`命令的一些常用选项以及...

    linux 之history命令用法

    `history`命令是Linux系统中一个非常实用的工具,主要用于查看用户在当前终端会话中执行过的所有命令历史记录。这对于回溯之前的操作或者重复执行之前的命令是非常有用的。本文将详细介绍`history`命令的基本用法...

    linux设置shell命令—–set

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

    linux下vi命令总结

    在 Linux 的 vi 编辑器中,熟练掌握导航命令对于提高编辑效率至关重要。 - **移动光标** - `h`:向左移动一个字符。 - `j`:向下移动一行。 - `k`:向上移动一行。 - `l`:向右移动一个字符。 - `0` 或者 `^`...

    Linux的vim命令合集

    在Linux操作系统中,`vim`(Vi Improved)是一款强大的文本编辑器,被广泛用于创建、修改和查看文本文件。这个“Linux的vim命令合集”包含两个文档,旨在帮助学习者深入理解和掌握`vim`的基本操作和高级特性。以下是...

    Linux set命令用法详解

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

    Linux常用命令手写笔记

    以下是 Linux 中一些常用的命令和技巧: 基本命令 1.关机命令:halt、shutdown、poweroff halt 和 shutdown 命令可以关闭系统,但它们的区别在于 halt 命令不会断电,而 shutdown 命令会断电。poweroff 命令是关闭...

    Linux终端常用命令

    Linux系统是目前广泛使用的开源操作系统之一,它的终端命令行界面为用户提供了丰富的操作命令,这些命令覆盖了系统管理、文件操作、用户管理、权限设置、查找和搜索等多个方面。下面是Linux终端常用命令的详细知识点...

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

    本文将详细介绍"Linux Command Set For Developer"中涵盖的关键知识点,帮助您在一个小时内快速上手开发者必备的Linux命令。 一、文件与目录管理 1. `cd`: 改变当前工作目录,是Linux中最基本的命令之一。如:`cd ...

    linux 服务安装mysql命令

    Linux 服务安装 MySQL 命令详解 在 Linux 操作系统中,安装 MySQL 服务器是一个基本的任务,对新手来说可能有些困难。本文将详细介绍如何安装 MySQL 服务器,包括安装、设置开机启动、启动服务、设置 root 用户密码...

    linux下的特殊命令

    在Linux操作系统中,掌握一些特殊的命令和Shell脚本技巧对于日常的系统管理和自动化任务执行至关重要。以下是关于"linux下的特殊命令"的详细知识点: 1. **Shell脚本调试方法**: - `set -x`:开启命令追踪,打印...

    Linux命令详解手册

    Linux命令详解手册是一本适合Linux新手和有一定基础的用户深入学习Linux命令的指南。它详细介绍了大量的Linux命令,涵盖了系统管理、系统设置、文档编辑以及压缩备份等多个方面的操作。掌握这些命令对于理解和使用...

    linux基本命令大全.pdf

    本文档旨在总结 Linux 系统中常用的基本命令,涵盖用户管理、文件管理、目录管理、权限管理、磁盘管理、进程管理、网络管理等方面。 用户管理 * useradd 创建用户 * usermod 修改用户信息 * userdel 删除用户 * ...

    java执行远程linux服务器命令

    在Java编程中,执行远程Linux服务器命令是一项常见的需求,特别是在自动化运维、远程管理或集成测试等场景下。本文将深入探讨如何使用Java实现这一功能,同时结合提供的标签"源码"和"工具"来理解其背后的实现原理和...

    linux vim 命令 总结

    通过掌握ViM的基本命令和操作模式,可以极大地提升Linux用户的工作效率。 1. **启动与退出编辑器** - 要开始编辑文件,只需在shell中输入`vi`或`vim`,后跟文件名,如`vi first_script`。 - 若要在指定行开始编辑...

    Linux命令大全(CHM格式离线版)

    Linux命令大全(CHM格式离线版) Linux命令大全(修改版) 进行重新编译的说明 文件传输 bye ftp ftpcount ftpshut ftpwho ncftp tftp uucico uucp uupick uuto 备份压缩 ar bunzip2 bzip2 bzip2recover compress cpio ...

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

    而不像普通的iptables链是线性的存储和过滤,ip集合存储在带索引的数据结构中,这种结构即时集合比较大也可以进行高效的查找. 除了一些常用的情况,比如阻止一些危险主机访问本机,从而减少系统资源占用或网络拥塞

Global site tag (gtag.js) - Google Analytics