Linux set 命令的使用方法

Posted 青冬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

set -x
x=10
while [ $x -gt 0 ]; do
    x=$[ $x-1 ]
    echo $x
    sleep 1
done

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

变量导出 -a

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

#! /bin/bash
# Copyright◎2022, Maggot. All rights reserved.
#
# This program is print the "Hello the world" to screen.
# Date: 2022-11-20
# Auth: huangyichun
# Version: 0.1
one=1
two=2
function myecho 
    echo A
    echo B

myecho
echo $one $two
/bin/bash
exit 0

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

生产环境示例

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

if [ -f "$user_conf_dir/spark-env.sh" ]; then
  # Promote all variable declarations to environment (exported) variables
  set -a
  . "$user_conf_dir/spark-env.sh"
  set +a
fi

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

命令错误exit -e

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

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

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

 

但如果加上了 -e 命令:

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

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

 

结果输出 >, >&

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

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

未定义变量报错 -u

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

#! /bin/bash
# Copyright◎2022, Maggot. All rights reserved.
#
# This program is print the "Hello the world" to screen.
# Date: 2022-11-21
# Auth: huangyichun
# Version: 0.1

set -u
var1="123"
echo $var1 $var2
echo done

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

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

设置arguments

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

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


参数拆分 set -- STRING

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

echo $*
aString="This is a string"
set -- $aString
echo $*
echo $1
echo $2
echo $3
echo $4


任务通知 -ab

-o notify -o allexport

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

sleep 3s &
# 等待 3s
# 回车


以上是关于Linux set 命令的使用方法的主要内容,如果未能解决你的问题,请参考以下文章

请问一下linux命令行中那个长的横线怎么打出来?

linux中怎么查看硬盘剩余空间

Linux常用命令

linux 关于长格式选项

linux 查看磁盘剩余命令

为啥有的LINUX命令行有2个减号,比如 ps -aux --sort pid 而用ps -aux -sort pid 就不行呢?