# set - 显示或设置shell特性及shell变量

set指令用来修改shell变量的显示和执行方式,没有任何选项和参数的时候,显示所有的变量名字和值。

set命令 作用主要是显示系统中已经存在的shell变量,以及设置shell变量的新变量值。使用set更改shell特性时,符号"+"和"-"的作用分别是打开和关闭指定的模式。set命令不能够定义新的shell变量。如果要定义新的变量,可以使用declare命令以变量名=值的格式进行定义即可。

# 适用范围

RedHat
RHEL
Ubuntu
CentOS
Debian
Deepin
SUSE
openSUSE
Fedora
Linux Mint
Alpine Linux
Arch Linux

# 语法

set    [OPTION] [参数]

# 选项

-a                   # 自动标记已经创建或者修改的变量,以供输出到环境变量
-b                   # 使被终止的后台程序立刻汇报状态
-e                   # 如果指令执行的退出值不是0,那么立刻退出
-f                   # 取消使用通配符
-h                   # 自动记录函数所在的位置
-k                   # 指令的参数都会被看作是指令的环境变量
-m                   # 使用监视模式
-n                   # 只读模式,不执行
-p                   # 启动优先顺序模式
-t                   # 当读取执行命令之后退出
-u                   #  
-v                   # 显示shell读取的输入值
-x                   # 执行指令后显示该指令和其参数
-o option            # 打开指定的特性。如果没有指定option,那么就打印当前的选项值
+o                   # 关闭指定的特性。如果没有指定option,则在标准输出中显示一系列用于重新创建当前选项设置的SET命令。
-B                   # shell执行支撑扩展(请参阅上面的Braces扩展)。默认情况下这是打开的。
-C                   # 如果设置,bash不会用’>’、’>&’和’<>’重定向操作符覆盖现有文件。当使用重定向运算符”>|”而不是”>”创建输出文件时,可能会重写此操作。
-E                   # 如果设置了,Err上的任何陷阱都由shell函数、命令替换和在子shell环境中执行的命令继承。在这种情况下,错误陷阱通常不会被继承。
-H                   # 启用!风格历史替代。默认情况下,当shell是交互式的时,此选项是打开的。
-P                   # 如果已设置,则在执行更改当前工作目录的命令(如CD)时,shell不会遵循符号链接。它使用物理目录结构。默认情况下,bash在执行更改当前目录的命令时遵循目录逻辑链。
-T                   # 如果设置,任何调试和返回的陷阱都由shell函数、命令替换和在子shell环境中执行的命令继承。在这种情况下,通常不会继承调试和返回陷阱。
--                   # 如果在此选项之后没有参数,那么位置参数将被取消设置。否则,位置参数将被设置为args,即使其中一些参数以‘-’开头。
-                    # 向选项的结束发出信号,使所有剩余的args被分配到位置参数。关闭-x和-v选项。如果没有args,则位置参数保持不变。

其中选项o的特征:

allexport            # 等价于“-a”
braceexpand          # 等价于“-B”
emacs                # 使用emacs风格的命令行编辑界面。默认情况下,当shell是交互式的时,这是启用的,除非shell是用“--noediting”选项启动的。
errexit              # 等价于“-e”
errtrace             # 等价于“-E”
functrace            # 等价于“-T”
hashall              # 等价于“-h”
histexpand           # 等价于“-H”
history              # 启用命令历史记录,如上文在“历史记录”下所述。默认情况下,此选项在交互式shell中打开。
ignoreeof            # 其效果似乎是执行了shell命令‘IGNOREEOF=10’(参见上面的Shell变量)。
keyword              # 等价于“-k”
monitor              # 等价于“-m”
noclobber            # 等价于“-C”
noexec               # 等价于“-n”
noglob               # 等价于“-f”
nolog                # 忽略
notify               # 等价于“-b”
nounset              # 等价于“-u”
onecmd               # 等价于“-t”
physical             # 等价于“-P”
pipefail             # 如果已设置,则管道的返回值是在非零状态下退出的最后一个(最右边)命令的值,如果管道中的所有命令都成功退出,则为零。默认情况下,此选项被禁用。
posix                # 将默认操作与POSIX标准不同的bash行为更改为与标准(POSIX模式)匹配。
privileged           # 等价于“-p”
verbose              # 等价于“-v”
vi                   # 使用vi样式的命令行编辑界面.这也会影响用于读-e的编辑界面。
xtrace               # 等价于“-x”

# 举例

显示所有的变量

[root@localhost ~]$ set
BASH=/bin/bash
BASHOPTS=cdspell:checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:
interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()

显示shell的输出值

[root@localhost ~]$ set -v
printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"

使用declare命令定义一个新的环境变量"mylove",并且将其值设置为"Visual C++",输入如下命令:

declare mylove='Visual C++'   #定义新环境变量

再使用set命令将新定义的变量输出为环境变量,输入如下命令:

set -a mylove                 #设置为环境变量

执行该命令后,将会新添加对应的环境变量。用户可以使用env命令和grep命令分别显示和搜索环境变量"mylove",输入命令如下:

env | grep mylove             #显示环境变量值

此时,该命令执行后,将输出查询到的环境变量值。