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] 是位置参数,与一下参数一起按顺序进行赋值:
不指定任何选项或者参数会导致该命令打印所有shell变量
set 的返回值
标志着命令成功执行
无效的参数,导致执行失败
缺少某些参数,导致执行失败
set options 设置命令清单
set 在进行 options 设置命令时,可以使用两种方法来设定:
简单好用而且可以直接叠加如
-ab
可以更好理解什么意思
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不匹配时,默认情况下启用该选项。关闭它会将有效的uid和gid设置为真实的uid和gid。 |
-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
# 回车