• Linux set 命令的使用方法


     

    Linux set 命令的使用方法

    set 语句是内置的 shell 命令,可以显示并设置 shell 和 Linux 的环境变量。在这篇文章中,我们将尝试使用 set 命令,并且进行一些简单的剖析。

    预备工作

    请登录您的终端,或者打开虚拟机并且连接,或者进入 Git Bash (不推荐)。

    演示系统为 CentOS7。

    set 命令语法

    一般我们使用 set 命令方式为:

    set [options] [arguments]

    可选 []

    当我们的参数中有 [] 时代表这个参数可选,如果不输入也不会有任何问题,比如我们直接输入 set :

    set

    会打印出当前 shell 的所有环境变量与函数。

    options 设置命令

    在 set 命令第一个参数是 Bash shell 环境中设置或取消设置的标志,可以定义后面各种 shell 的运行方式,比如打印额外的信息等等。

    • - 使用减号启用某些设置
    • + 使用加号关闭某些设置

    arguments 参数

    [arguments] 是位置参数,与一下参数一起按顺序进行赋值:

    • $1
    • $2
    • $3
    • ……
    • $n

    不指定任何选项或者参数会导致该命令打印所有shell变量

    set 的返回值

    • 0

            标志着命令成功执行

    • 1

            无效的参数,导致执行失败

    • 2

            缺少某些参数,导致执行失败

    set options 设置命令清单

    set 在进行 options 设置命令时,可以使用两种方法来设定:

    • -options

                    简单好用而且可以直接叠加如

                    -ab

    • -o Flag

                    可以更好理解什么意思

    Linux set 命令的使用方法

    Options

    -o Flag

    描述

    -a

    -o allexport

    将所有创建或修改的变量或函数标记为导出。

    -b

    -o notify

    后台作业终止时提醒用户。

    -e

    -o errexit

    指示shell在命令失败时退出,例如,如果它输出非零退出状态。

    -f

    -o noglob

    禁用文件名生成(globbing)

    -h

    -o hashall

    定义函数时,定位并保存函数命令。这-h默认情况下,选项处于启用状态。

    -k

    -o keyword

    将命令的所有赋值参数放在环境中,而不仅仅是命令名前面的那些参数。

    -n

    -o noexec

    读取命令,但不执行它们。

    -m

    -o monitor

    任务完成时显示消息。

    -p

    -o privileged

    禁用$ENV文件处理和shell函数导入。这-p当真实用户id和有效用户id不匹配时,默认情况下启用该选项。关闭它会将有效的uidgid设置为真实的uidgid

    -t

    -o onecmd

    读取一个命令,然后退出。

    -u

    -o nounset

    替换时,将未设置或未定义的变量视为错误(在参数扩展期间)。不适用于通配符等特殊参数*或者@.

    -v

    -o verbose

    读取shell输入行时打印出来。

    -x

    -o xtrace

    在执行过程中打印出命令参数。

    -B

    -o braceexpand

    执行壳支撑扩展。

    -C

    -o noclobber

    通过输出重定向防止覆盖现有的常规文件。默认情况下,Bash允许重定向输出覆盖现有文件。

    -E

    -o errtrace

    导致外壳函数继承ERR陷阱。

    -H

    -o histexpand

    启用样式历史替换。当壳是交互式的时,默认情况下该选项是打开的。

    -P

    -o physical

    执行命令时防止符号链接跟随。

    -T

    -o functrace

    导致外壳函数继承调试陷阱。

    --

    不适用的

    将剩余的参数分配给位置参数。如果没有剩余的参数,则取消设置位置参数。

    -

    不适用的

    将任何剩余的参数赋给位置参数。关闭-x-v选项。

    不适用的

    -o emacs

    使用emacs风格的行编辑界面。

    不适用的

    -o history

    启用命令历史。

    不适用的

    -o ignoreeof

    shell在读取文件结尾时不会退出。

    不适用的

    -o interactive-comments

    允许在交互式命令中添加注释。

    不适用的

    -o nolog

    不在历史文件中记录函数定义。

    不适用的

    -o pipefail

    管道的返回值是在退出时具有非零状态的最后一个命令的状态。如果没有命令在退出时具有非零状态,则该值为零。

    不适用的

    -o posix

    当默认操作不同于Posix标准时,使Bash符合标准。

    不适用的

    -o vi

    使用类似于的行编辑界面vi.

    set 部分命令用法实例

    脚本调试 -x

    当我们想进行某些脚本调试时,可以使用 -x / -o xtrace

    1. set -x
    2. x=10
    3. while [ $x -gt 0 ]; do
    4.     x=$[ $x-1 ]
    5.     echo $x
    6.     sleep 1
    7. done

    如上图所示,我们可以很清楚看到执行的真实命令的过程,方便我们进行各种 shell 程序的排错。

    变量导出 -a

    如果需要自动导出可以使用 -a / -o allexport。这样可以导出变量或者函数,允许其他的 them 和脚本使用它们。

    1. #! /bin/bash
    2. # Copyright◎2022, Maggot. All rights reserved.
    3. #
    4. # This program is print the "Hello the world" to screen.
    5. # Date: 2022-11-20
    6. # Auth: huangyichun
    7. # Version: 0.1
    8. one=1
    9. two=2
    10. function myecho {
    11.     echo A
    12.     echo B
    13. }
    14. myecho
    15. echo $one $two
    16. /bin/bash
    17. exit 0

    以上的代码块有误,需要后期修订!todo

    生产环境示例

    使用场景,当我们需要将部分变量进行导出时,希望更上一层的 shell 也能使用可以使用他。比如在 ${SPARK_HOME}/bin/load-spreak-env.sh 中有这样几句:

    1. if [ -f "${user_conf_dir}/spark-env.sh" ]; then
    2.   # Promote all variable declarations to environment (exported) variables
    3.   set -a
    4.   . "${user_conf_dir}/spark-env.sh"
    5.   set +a
    6. fi

    就是在运行 spark-env.sh 时,让其中的变量可以变为当前的环境变量。

    命令错误exit -e

    在我们脚本中,如果遇到有返回值不为0时,一般会继续运行后面的程序,如:

    1. #! /bin/bash
    2. # Copyright◎2022, Maggot. All rights reserved.
    3. #
    4. # This program is print the "Hello the world" to screen.
    5. # Date: 2022-11-21
    6. # Auth: huangyichun
    7. # Version: 0.1
    8. cat nonexistingfile.nef
    9. echo "The end"

    如果我们直接进行运行的话,cat命令的返回值其实不为0,已经产生报错,但是仍运行了接下来的 echo 命令。

     

    但如果加上了 -e 命令:

    1. #! /bin/bash
    2. # Copyright◎2022, Maggot. All rights reserved.
    3. #
    4. # This program is print the "Hello the world" to screen.
    5. # Date: 2022-11-21
    6. # Auth: huangyichun
    7. # Version: 0.1
    8. set -e
    9. cat nonexistingfile.nef
    10. echo "The end"

    在 cat 处报错了,就不会继续运行下去了。

     

    结果输出 >, >&

    我们上述的文件运行文件结果都是直接打印在终端中,但很多时候我们是需要运行后的结果,并且保存到其他文件中。这时候我们可以使用 > 进行结果重定向。

    详细可以参考结果重定向部分。

    未定义变量报错 -u

    在我们shell脚本中,可能有一些变量未进行定义但仍旧引用了。那么这个变量的值为null,在打印时就打印""。如:

    1. #! /bin/bash
    2. # Copyright◎2022, Maggot. All rights reserved.
    3. #
    4. # This program is print the "Hello the world" to screen.
    5. # Date: 2022-11-21
    6. # Auth: huangyichun
    7. # Version: 0.1
    8. set -u
    9. var1="123"
    10. echo $var1 $var2
    11. echo done

    可以看到 var1打印了123,但是var2值不存在,则什么也没打印。

    如果需要报错,则需要打开 set -u,并且可以看到连最后一行done都未打印。

    设置arguments

    上面也提到了,可以两种参数,一种是-o Flag 或者 -X。还有一种是直接设置入参参数。设置入参参数了后可以直接 $N 进行获取。比如:

    1. echo some args : $1 $2 $3 $4
    2. set one two three args
    3. echo some args : $1 $2 $3 $4
    4. echo $*


    参数拆分 set -- STRING

    在某些字符串需要按照空格进行拆分的时候,可以直接使用 set -- STRING 就能够拆分,当然注意拆分后的变量赋值到入参中。

    1. echo $*
    2. aString="This is a string"
    3. set -- $aString
    4. echo $*
    5. echo $1
    6. echo $2
    7. echo $3
    8. echo $4


    任务通知 -ab

    -o notify -o allexport

    但shell完成时,会在作业终端通知,默认打开。

    1. sleep 3s &
    2. # 等待 3s
    3. # 回车


  • 相关阅读:
    实现一个动态规划算法,解决背包问题
    (五):jenkins Node JS插件安装+配置
    NewStarCTF2023week3-Rabin‘s RSA
    包管理机制、变量声明方式的区别
    PPT文件设置打开密码的两种方法
    Linux安装RabbitMQ教程(文件下载地址+安装命令+ 端口开放 + 用户创建 +配置文件模板+端口修改)
    10.Python_结构型模式_代理模式
    boost::bind 不能处理函数重载 (error: no matching function for call to 'bind')
    【无标题】
    番外--Task2:
  • 原文地址:https://blog.csdn.net/qq_36610426/article/details/127974653