set: set [--abefhkmnptuvxBCHP] [-o 选项名] [--] [参数 ...]
设定或取消设定 shell 选项和位置参数的值。
改变 shell 选项和位置参数的值,或者显示 shell 变量的
名称和值。
选项:
-a 标记修改的或者创建的变量为导出。
-b 立即通告任务终结。
-e 如果一个命令以非零状态退出,则立即退出。
-f 禁用文件名生成(模式匹配)。
-h 当查询命令时记住它们的位置
-k 所有的赋值参数被放在命令的环境中,而不仅仅是
命令名称之前的参数。
-m 启用任务控制。
-n 读取命令但不执行
-o 选项名
设定与选项名对应的变量:
allexport 与 -a 相同
braceexpand 与 -B 相同
emacs 使用 emacs 风格的行编辑界面
errexit 与 -e 相同
errtrace 与 -E 相同
functrace 与 -T 相同
hashall 与 -h 相同
histexpand 与 -H 相同
history 启用命令历史
ignoreeof shell 读取文件结束符时不会退出
interactive-comments
允许在交互式命令中显示注释
keyword 与 -k 相同
monitor 与 -m 相同
noclobber 与 -C 相同
noexec 与 -n 相同
noglob 与 -f 相同
nolog 目前可接受但是被忽略
notify 与 -b 相同
nounset 与 -u 相同
onecmd 与 -t 相同
physical 与 -P 相同
pipefail 管道的返回值是最后一个非零返回值的命令的返回结果,
或者当所有命令都返回零是也为零。
posix 改变默认时和 Posix 标准不同的 bash 行为
以匹配标准
privileged 与 -p 相同
verbose 与 -v 相同
vi 使用 vi 风格的行编辑界面
xtrace 与 -x 相同
-p 无论何时当真实的有效的用户身份不匹配时打开。
禁用对 $ENV 文件的处理以及导入 shell 函数。
关闭此选项会导致有效的用户编号和组编号设定
为真实的用户编号和组编号
-t 读取并执行一个命令之后退出。
-u 替换时将为设定的变量当作错误对待。
-v 读取 shell 输入行时将它们打印。
-x 执行命令时打印它们以及参数。
-B shell 将执行花括号扩展。
-C 设定之后禁止以重定向输出的方式覆盖常
规文件。
-E 设定之后 ERR 陷阱会被 shell 函数继承。
-H 启用 ! 风格的历史替换。当 shell 是交互式的
时候这个标识位默认打开。
-P 设定之后类似 cd 的会改变当前目录的命令不
追踪符号链接。
-T 设定之后 DEBUG 陷阱会被 shell 函数继承。
-- 任何剩余的参数会被赋值给位置参数。如果没
有剩余的参数,位置参数不会被设置。
- 任何剩余的参数会被赋值给位置参数。
-x 和 -v 选项已关闭。
+<参数> 取消某个set曾启动的参数。
使用 + 而不是 - 会使标志位被关闭。标志位也可以在
shell 被启动时使用。当前的标志位设定可以在 $- 变
量中找到。剩余的 ARG 参数是位置参数并且是按照
$1, $2, .. $n 的顺序被赋值的。如果没有给定 ARG
参数,则打印所有的 shell 变量。
退出状态:
返回成功除非使用了无效的参数。
1.什么是set命令?
♦ set命令作用主要是显示系统中已经存在的shell变量,以及设置shell变量的新变量值。使用set更改shell特性时,符号"+"和"-"的作用分别是打开和关闭指定的模式。set命令不能够定义新的shell变量。如果要定义新的变量,可以使用declare命令以变量名=值
的格式进行定义即可。
♦ set -x 是开启, set +x是关闭, set -o是查看 (xtrace), set去追中一段代码的显示情况。执行set -x后,对整个脚本有效。
定义新变量:
declare 变量名='变量值'#注意值要带引号
2.为什么要用set命令?
♦ set不能新增变量,但是我们可以用set对新增的已有的变量进行一些操作,使之有了新的意义,如set可以把已有的的变量操作成环境变量等等。
3.怎样使用set命令?
用法:
set(选项)(参数)
选项:
-a:标示已修改的变量,以供输出至环境变量。 -b:使被中止的后台程序立刻回报执行状态。 -C:转向所产生的文件无法覆盖已存在的文件。 -d:Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。 -e:若指令传回值不等于0,则立即退出shell。 -f:取消使用通配符。 -h:自动记录函数的所在位置。 -H Shell:可利用"!"加<指令编号>的方式来执行history中记录的指令。 -k:指令所给的参数都会被视为此指令的环境变量。 -l:记录for循环的变量名称。 -m:使用监视模式。 -n:只读取指令,而不实际执行。 -p:启动优先顺序模式。 -P:启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。 -t:执行完随后的指令,即退出shell。 -u:当执行时使用到未定义过的变量,则显示错误信息。 -v:显示shell所读取的输入值。 -x:执行指令后,会先显示该指令及所下的参数。
参数
取消某个set曾启动的参数。
实例
使用declare命令定义一个新的环境变量"mylove",并且将其值设置为"meinv",输入如下命令:
declare mylove='meinv' #定义新变量
再使用set命令将新定义的变量输出为环境变量,输入如下命令:
set -a mylove #设置为环境变量
执行该命令后,将会新添加对应的环境变量。
用户可以使用env命令和grep命令分别显示和搜索环境变量"mylove",输入命令如下:
env | grep mylove #显示环境变量值
此时,该命令执行后,将输出查询到的环境变量值。
问题:set 都能显示出那些变量呢?
♦环境变量
[root@localhost ~]# set BASH=/bin/bash BASH_ARGC=() BASH_ARGV=() BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu") BASH_VERSION='3.2.25(1)-release' COLORS=/etc/DIR_COLORS COLUMNS=190 CVS_RSH=ssh DIRSTACK=() EUID=0 GROUPS=() G_BROKEN_FILENAMES=1 HISTFILE=/home/zszc/.bash_history HISTFILESIZE=1000 HISTSIZE=1000 HOME=/home/zszc HOSTNAME=localhost HOSTTYPE=x86_64 IFS=$' \t\n' INPUTRC=/etc/inputrc KDEDIR=/usr KDE_IS_PRELINKED=1 KDE_NO_IPV6=1 LANG=zh_CN.UTF-8 LC_ALL=zh_CN.GBK LESSOPEN='|/usr/bin/lesspipe.sh %s' LINES=39 LOGNAME=root LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:' MACHTYPE=x86_64-redhat-linux-gnu MAIL=/var/spool/mail/root MAILCHECK=60 OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PATH=/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/home/zszc/bin PIPESTATUS=([0]="0") PPID=13624 PRELINKING=yes PRELINK_FULL_TIME_INTERVAL=14 PRELINK_NONRPM_CHECK_INTERVAL=7 PRELINK_OPTS=-mR PS1='[\u@\h \W]\$ ' PS2='> ' PS4='+ ' PWD=/home/zszc QTDIR=/usr/lib64/qt-3.3 QTINC=/usr/lib64/qt-3.3/include QTLIB=/usr/lib64/qt-3.3/lib SHELL=/bin/bash SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor SHLVL=1 SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass SSH_CLIENT='192.168.113.206 17527 22' SSH_CONNECTION='192.168.113.206 17527 192.168.44.33 22' SSH_TTY=/dev/pts/1 SUPPORTED=zh_CN.UTF-8:zh_CN:zh TERM=vt100 UID=0 USER=root _=liqiang.sh a='echo hollo li' consoletype=pty mpi_selection= mpi_selector_dir=/var/lib/mpi-selector/data mpi_selector_homefile=/home/zszc/.mpi-selector mpi_selector_sysfile=/etc/sysconfig/mpi-selector qt_prefix=/usr/lib64/qt-3.3 tmpid=0
♦ 定义的全局变量
♦ 普通子shell中的 普通变量我们可以这样显示
set source + filename#可以用set显示出来了
[root@localhost ~]# set source + liqiang.sh [root@localhost ~]# set BASH=/bin/bash BASH_ARGC=() BASH_ARGV=() BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu") BASH_VERSION='3.2.25(1)-release' COLORS=/etc/DIR_COLORS COLUMNS=190 CVS_RSH=ssh DIRSTACK=() EUID=0 GROUPS=() G_BROKEN_FILENAMES=1 HISTFILE=/home/zszc/.bash_history HISTFILESIZE=1000 HISTSIZE=1000 HOME=/home/zszc HOSTNAME=localhost HOSTTYPE=x86_64 IFS=$' \t\n' INPUTRC=/etc/inputrc KDEDIR=/usr KDE_IS_PRELINKED=1 KDE_NO_IPV6=1 LANG=zh_CN.UTF-8 LC_ALL=zh_CN.GBK LESSOPEN='|/usr/bin/lesspipe.sh %s' LINES=39 LOGNAME=root LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:' MACHTYPE=x86_64-redhat-linux-gnu MAIL=/var/spool/mail/root MAILCHECK=60 OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PATH=/home/zszc/zpp/weblogic/weblogic103/user_projects/domains/zszc_7008_domain/bin:/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/home/zszc/bin PIPESTATUS=([0]="0") PPID=13624 PRELINKING=yes PRELINK_FULL_TIME_INTERVAL=14 PRELINK_NONRPM_CHECK_INTERVAL=7 PRELINK_OPTS=-mR PS1='[\u@\h \W]\$ ' PS2='> ' PS4='+ ' PWD=/home/zszc QTDIR=/usr/lib64/qt-3.3 QTINC=/usr/lib64/qt-3.3/include QTLIB=/usr/lib64/qt-3.3/lib SHELL=/bin/bash SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor SHLVL=1 SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass SSH_CLIENT='192.168.113.206 17527 22' SSH_CONNECTION='192.168.113.206 17527 192.168.44.33 22' SSH_TTY=/dev/pts/1 SUPPORTED=zh_CN.UTF-8:zh_CN:zh TERM=vt100 UID=0 USER=root _=liqiang.sh a='echo hollo li' consoletype=pty mpi_selection= mpi_selector_dir=/var/lib/mpi-selector/data mpi_selector_homefile=/home/zszc/.mpi-selector mpi_selector_sysfile=/etc/sysconfig/mpi-selector qt_prefix=/usr/lib64/qt-3.3 tmpid=0
set的通常用法示例:
1、set 显示环境变量:
如:在命令行下输入:
set 会显示当前所有的系统环境变量
set c 会显示所有的以c开头或C开头的变量(也即不区分大小写);
set com 会显示所有的以com开头或COM开头的变量(不区分大小写);
2、set 设置环境变量,用法示例:set 表达式,
如:set str=ok
就是将变量str的值设置成字符串“OK”
注意:set str=ok>
这个在批处理运行过程中会出错,系统会提示:“命令语法不正确。”
原因是,因为 变量str 中的值“ok>”的字符">"为一特殊字符,会被系统当成 定向 符处理,所以会运行出错,那如果确实要设置这样的变量str,值为 "ok>"怎么办呢?解决办法有二:将特殊字符转义,转义方法在该特殊字符前加一个“^”,如:set str=ok^> (这种方法比较少用,因为没有多少应用价值)
常见的解决办法,在set后面将整个表达式用 引号括起来,如:set "str=>"
3、带参数 /a的set 数值计算
set的/A参数就是让SET可以支持数学符号进行加减等一些数学运算! 支持的数学运算包含(优先权递减):
() - 分组
! ~ - - 一元运算符
* / % - 算数运算符
+ - - 算数运算符
<< >> - 逻辑移位
& - 按位“与”
^ - 按位“异”
| - 按位“或”
= *= /= %= += -= - 赋值
&= ^= |= <<= >>=
, - 表达式分隔符
用法示例:set /a num=2*10,这样变量num的值将变为:20
set 用来显示本地变量
env 用来显示环境变量
export 用来显示和设置环境变量
set 显示当前shell的变量,包括当前用户的变量
env 显示当前用户的变量
export 显示当前导出成用户变量的shell变量
每个shell有自己特有的变量(set)显示的变量,这个和用户变量是不同的,当前用户变量和你用什么shell无关,不管你用什么shell都在,比如HOME,SHELL等这些变量,但shell自己的变量不同shell是不同的,比如BASH_ARGC, BASH等,这些变量只有set才会显示,是bash特有的,export不加参数的时候,显示哪些变量被导出成了用户变量,因为一个shell自己的变量可以通过export “导出”变成一个用户变量
Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都是相同的,这个默认环境实际上就是一组环境 变量的定义。用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。
什么是环境变量
环境变量是一个具有 特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。许多用户(特别是那些刚接触Linux的新手)发现这些变量有些怪异或者难以控制。其 实,这是个误会:通过使用环境变量,你可以很容易的修改一个牵涉到一个或多个应用程序的配置信息。
常见的环境变量
对于 PATH和HOME等环境变量大家都不陌生。
PATH能够指定命令的搜索路径,那么动态链接库的路径用什么变量指定呢?或者就是在 PATH里面?
比如有一个程序需要/usr/local/lib下面的一个库文件,应该怎么指定其路径呢?
经常看到有些变量如 LD_LIBRARY_PATH,LIBPATH,CLASSPATH等,他们之间有什么不同和关系?
除此之外,还有下面一些常见环境变 量。
◆ HISTSIZE是指保存历史命令记录的条数。
◆ LOGNAME是指当前用户的登录名。
◆ HOSTNAME是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。
◆ SHELL是指当前用户用的是哪种Shell。
◆ LANG/LANGUGE是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。
◆ MAIL是指当前用户的邮件存放目录。
◆ PS1是基本提示符,对于root用户是#,对于普通用户是$。PS2是附属提示符,默认是“>”。可以通过修改此环境变量来修改当前的命令符,比 如下列命令会将提示符修改成字符串“Hello,My NewPrompt ”。
# PS1=" Hello,My NewPrompt "
Hello,My NewPrompt
除了这些常见的环境变量,许多应用程序在安装时也会增加 一些环境变量,比如使用Java就要设置JAVA_HOME和CLASSPATH等,而安装五笔输入法会增加环境变量"XMODIFIERS=@im=fcitx"等。
定制 环境变量
环境变量是和Shell紧密相关的,用户登录系统后就启动了一个Shell。对于Linux来说一般是bash,但也可以重新设 定或切换到其它的 Shell。环境变量是通过Shell命令来设置的,设置好的环境变量又可以被所有当前用户所运行的程序所使用。对于bash这个Shell程序来说,可 以通过变量名来访问相应的环境变量,通过export来设置环境变量。下面通过几个实例来说明。
1. 显示环境变量HOME
$ echo $HOME
/home/terry
2. 设置一个新的环境变量WELCOME
$ export WELCOME="Hello!"
$ echo $WELCOME
Hello!
3. 使用env命令显示所有的环境变量
$ env
HOSTNAME=terry.mykms.org
PVM_RSH=/usr/bin/rsh
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
...
4. 使用set命令显示所有本地定义的Shell变量
$ set
BASH=/bin/bash
BASH_VERSINFO=([0]="2"[1]="05b"[2]="0"[3]="1"[4]="release"[5]="i386-redhat-linux-gnu")
BASH_VERSION='2.05b.0(1)-release'
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=80
DIRSTACK=()
DISPLAY=:0.0
...
5. 使用unset命令来清除环境变量
set可以设置某个环境变量的值。清除环境变量的值用unset命令。如果未指定值,则该变量值将被 设为NULL。示例如下:
$ export TEST="Test..." #增加一个环境变量TEST
$ env|grep TEST #此命令有输入,证明环境变量TEST已经存在了
TEST=Test...
$ unset $TEST #删除环境变量TEST
$ env|grep TEST #此命令没有输出,证明环境变量TEST已经存在了
6. 使用readonly命令设置只读变量
如果使用了readonly命令的话,变量就不可以被修改或清除了。示例如下:
$ export TEST="Test..." #增加一个环境变量TEST
$ readonly TEST #将环境变量TEST设为只读
$ unset TEST #会发现此变量不能被删除
-bash: unset: TEST: cannot unset: readonly variable
$ TEST="New" #会发现此也变量不能被修改
-bash: TEST: readonly variable
7. 用C程序来访问和设置环境变量
对于C程序 的用户来说,可以使用下列三个函数来设置或访问一个环境变量。
◆ getenv()访问一个环境变量。输入参数是需要访问的变量名字,返回值是一个字符串。如果所访问的环境变量不存在,则会返回NULL。
◆ setenv()在程序里面设置某个环境变量的函数。
◆ unsetenv()清除某个特定的环境变量的函数。
另外, 还有一个指针变量environ,它指向的是包含所有的环境变量的一个列表。下面的程序可以打印出当前运行环境里面的所有环境变量:
#include <stdio.h>
extern char**environ;
int main ()
{
char**var;
for (var =environ;*var !=NULL;++var)
printf ("%s n ",*var);
return 0;
}
还可以通过修改一些相关的环境定义文件来修改 环境变量,比如对于Red Hat等Linux发行版本,与环境相关的文件有/etc/profile和~/.bashrc等。修改完毕后重新登录一次就生效了。
重 要的例子
下表罗列了一些Linux系统使用的变量并说明了它们的用处。在表格后面将列举一些变量例值。
变量 说明
PATH 这个变量包含了一系列由冒号分隔开的目录,系统就从这些目录里寻找可执行文件。如果你输入的可执行文件(例如ls、rc-update或者emerge) 不在这些目录中,系统就无法执行它(除非你输入这个命令的完整路径,如/bin/ls)。
ROOTPATH 这个变量的功能和PATH相同,但它只罗列出超级用户(root)键入命令时所需检查的目录。
LDPATH 这个变量包含了一系列用冒号隔开的目录,动态链接器将在这些目录里查找库文件。
MANPATH 这个变量包含了一系列用冒号隔开的目录,命令man会在这些目录里搜索man页面。
INFODIR 这个变量包含了一系列用冒号隔开的目录,命令info将在这些目录里搜索info页面。
PAGER 这个变量包含了浏览文件内容的程序的路径(例如less或者more)。
EDITOR 这个变量包含了修改文件内容的程序(文件编辑器)的路径(比如nano或者vi)。
KDEDIRS 这个变量包含了一系列用冒号隔开的目录,里面放的是KDE相关的资料。
CONFIG_PROTECT 这个变量包含了一系列用空格隔开的目录,它们在更新的时候会被Portage保护起来。
CONFIG_PROTECT_MASK 这个变量包含了一系列用空格隔开的目录,它们在更新的时候不会被Portage保护起来。
下面你可以找到所有这些变量定义的范 例:
代码 1: 定义范例
PATH="/bin:/usr/bin:/usr/local/bin:/opt/bin:/usr/games/bin"ROOTPATH="/sbin:/bin:/usr/sbin
:/usr/bin:/usr/local/sbin:/usr/local/bin"LDPATH="/lib:/usr/lib:/usr/local/lib:/usr/lib/gcc-lib/i686
-pc-linux-gnu/3.2.3"MANPATH="/usr/share/man:/usr/local/share/man"INFODIR="/usr/share/info:/us
r/local/share/info"PAGER="/usr/bin/less"EDITOR="/usr/bin/vim"KDEDIRS="/usr"CONFIG_
PROTECT="/usr/X11R6/lib/X11/xkb /opt/tomcat/conf /usr/kde/3.1/share/config /usr
/share/texmf/tex/generic/config/ /usr/share/texmf/tex/platex/config/ /usr/share/confi
g"CONFIG_PROTECT_MASK="/etc/gconf"
对于bash shell
关 于环境变量命令介绍:
1.echo 显示某个环境变量值 echo $PATH
2.export 设置一个新的环境变量 export HELLO="hello" (可以无引号)
3.env 显示所有环境变量
4.set 显示本地定义的shell变量
5.unset 清除环境变量 unset HELLO
6.readonly 设置只读环境变量 readonly HELLO
常见的环境变量
PATH:决定了shell将到哪些目录中寻找命令或程序
HOME:当前用户主目录
MAIL:是指当前用户的邮件存放目录。
SHELL:是指当前用户用的是哪种Shell。
HISTSIZE:是指保存历史命令记录的条数
LOGNAME:是指当前用户的登录名。
HOSTNAME:是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。
LANG/LANGUGE:是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。
PS1:是基本提示符,对于root用户是#,对于普通用户是$。
PS2:是附属提示符,默认是“>”。可以通过修改此环境变量来修改当前的命令符,比如下列命令会将提示符修改成字符串“Hello,My NewPrompt :) ”。
# PS1=" Hello,My NewPrompt :) "
使 用修改.bashrc文件进行环境变量的编辑,只对当前用户有用。
使用修改 /etc/profile 文件进行环境变量的编辑,是对所有用户有用。大家一定要注意区别。