当前位置:首页 > 运维 > 正文内容

linux中set指令用法

phpmianshi5年前 (2016-04-26)运维430

简介

我们知道,Bash 执行脚本的时候,会创建一个新的 Shell,这个 Shell 就是脚本的执行环境,Bash 默认给定了这个环境的各种参数。set命令用来修改 Shell 环境的运行参数,也就是可以定制环境。


语  法

[root@localhost ~]# help setset: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
    Set or unset values of shell options and positional parameters.
    设置或者复位shell选项的值和位置参数的值.    Change the value of shell attributes and positional parameters, or
    display the names and values of shell variables.
    改变shell属性的值和位置参数的值, 或者显示shell变量的名字和值.

    Options:
    (我删去了一些选项)
      -h  Remember the location of commands as they are looked up.
      -H  Enable ! style history substitution.  This flag is on
          by default when the shell is interactive.
      -v  Print shell input lines as they are read.
      -x  Print commands and their arguments as they are executed.      --  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.
          将任何剩余的参数分配给位置参数. -x和-v选项会被关闭.    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.
    使用 + 而不是 - 会导致这些标志被关闭. 这些标志还可以在调用shell时被使用.
    这些标志的当前的设置可以在 $- 中被找到. 剩余的n个参数是位置参数, 它们会被
    按顺序分配给 $1, $2, .. $n. 如果没有给出参数, 所有的shell变量会被打印出来.    Exit Status:    Returns success unless an invalid option is given.
    返回success, 除非给出了一个无效的参数.

补充说明

用set 命令可以设置各种shell选项或者列 出shell变量.单个选项设置常用的特性.在某些选项之后

-o参数将特殊特性打开.在某些选项之后使用

+o参数将关闭某些特性,不带任何参数的set命令将显示shell的全部变量.除非遇到非法的选项,否则set总是返回true

参数说明

allexport           -a         从设置开始标记所有新的和修改过的用于输出的变量        
braceexpand         -B         允许符号扩展,默认选项  
emacs                          在进行命令编辑的时候,使用内建的emacs编辑器, 默认选项
errexit            -e          如果一个命令返回一个非0退出状态值(失败),就退出.
histexpand         -H          在做临时替换的时候允许使用!和!! 默认选项
history                        允许命令行历史,默认选项
ignoreeof                      禁止coontrol-D的方式退出shell,必须输入exit。
interactive-comments           在交互式模式下, #用来表示注解
keyword             -k         为命令把关键字参数放在环境中
monitor             -m        允许作业控制
noclobber           -C        保护文件在使用重新动向的时候不被覆盖
noexec              -n        在脚本状态下读取命令但是不执行,主要为了检查语法结构。
noglob              -d        禁止路径名扩展,即关闭通配符    
notify              -b        在后台作业以后通知客户
nounset             -u        在扩展一个没有的设置的变量的时候,显示错误的信息    
onecmd              -t        在读取并执行一个新的命令后退出      
physical            -P         如果被设置,则在使用pwd和cd命令时不使用符号连接的路径 而是物理路径
posix                         改变shell行为以便符合POSIX要求
privileged                    一旦被设置,shell不再读取.profile文件和env文件 shell函数也不继承任何环境
verbose             -v        为调试打开verbose模式
vi                             在命令行编辑的时候使用内置的vi编辑器
xtrace             -x          打开调试回响模式

对于不知道某些选项是否开启,可以使用以下的指令:

set -o


查看各个参数的默认状态:

$ set -o
allexport       off
braceexpand     on
emacs           on
errexit         off
errtrace        off
functrace       off
hashall         on
histexpand      on
history         on

示例1.  set -e

若程序 异常(返回 非 true)值, 程序会继续向下执行。

errexit                 -e                        如果一个命令返回一个非0退出状态值(失败),就退出.

#! /bin/bash
set -e
#set -o errexit  另一种写法
foo
echo bar


示例2. set -x

默认情况下,脚本执行后,屏幕只显示运行结果,没有其他内容。如果多个命令连续执行,它们的运行结果就会连续输出。有时会分不清,某一段内容是什么命令产生的。

set -x用来在运行结果之前,先输出执行的那一行命令。

#! /bin/bash
set -x       # 执行指令前,先输出指令
#set -o xtrace  # 另一种写法
echo hello

示例3. set -u

对于一些变量 APP=   若忘记设置值,可能会导致 rm -rf /${APP}   变为 rm -rf /. 这是非常危险的操作。

nounset              -u                        在扩展一个没有的设置的变量的时候,    显示错误的信息    

执行脚本时,遇到不存在变量,bash报错并停止

! /bin/bash

set -u      # 注释与不注释执行结果不同
#set -o nounset  #另一种写法
echo $a
echo hello

示例4. set -o pipefail

set -e有一个例外情况,就是不适用于管道命令。

所谓管道命令,就是多个子命令通过管道运算符(|)组合成为一个大的命令。Bash 会把最后一个子命令的返回值,作为整个命令的返回值。也就是说,只要最后一个子命令不失败,管道命令总是会执行成功,因此它后面命令依然会执行,set -e就失效了。

请看下面这个例子

#!/bin/bash

set -e

foo | echo a

echo bar

执行结果如下。

$ bash script.sh

a

script.sh:行4: foo: 未找到命令

bar

上面代码中,foo是一个不存在的命令,但是foo | echo a这个管道命令会执行成功,导致后面的echo bar会继续执行。

set -o pipefail用来解决这种情况,只要一个子命令失败,整个管道命令就失败,脚本就会终止执行。

set -eo pipefail

foo | echo a

echo bar

运行后,结果如下

$ bash script.sh

a

script.sh:行4: foo: 未找到命令

可以看到,echo bar没有执行。

总结

set命令的上面这四个参数,一般都放在一起使用。

# 写法一 set -euxo pipefail

# 写法二 set -eux

set -o pipefail

这两种写法建议放在所有 Bash 脚本的头部。

另一种办法是在执行 Bash 脚本的时候,从命令行传入这些参数。

$ bash -euxo pipefail script.sh


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

linux中tee显示输出结果并且保存内容到文件

介绍tee最基本的用法就是显示输出结果并且保存内容到文件中。例如显示当前目录内容,并保存到1.txt 文件中[root@dev tmp]# ls -alh |&...

linux中利用nethogs查看哪些进程占用网络带宽

centos6版本安装1、安装依赖包yum install ncurses* -y yum install libpcap* -y2、下载...

nginx中request_time和upstream_response_time详解

背景最近监控报警有短暂的502,赶紧分析问题原因,查看nginx的access_log 发现短暂报警的request_time比较大,但是upstream_response_time有2个值,一个比较...

linux中如何查看系统io使用情况

linux中查看IO的方法主要有下面几种方法:1. top   %wa    的含义是等待输入输出的CPU时间百分比,这个数字越高说明越多的CPU资源...

linux中如何检测UDP端口是否开启

背景搭建了一台dnsmasq DNS解析服务器,不想对外网提供服务,只给内网提供解析服务,想关闭udp53端口的入站规则如何判断UDP 53端口是否提供服务呢?我们的服务端:123.207.190.8...

linux中流量监控工具iftop详解

linux中流量监控工具iftop详解

要查看实时的网络流量,监控TCP/IP连接等,则可以使用iftop。一、iftop是什么?iftop是类似于top的实时流量监控工具。官方网站:http://www.ex-parrot.com/~pd...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。