Shell是什么
shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户。这种对话方式可以是交互的方式(从键盘输入命令,可以立即得到shell的回应),或非交互(脚本)的方式。换句话说,Shell是一个命令行解释器,它为用户提供一个像Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动,挂起,停止甚至是编写一些程序。
Shell还是一个功能相当请打的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
Shell的3个特色
a>.能实现某种特定的功能;
b>.拥有执行权限的程序文件;
c>.遵循语法格式,功能(变量函数数组流程控制),系统命令等;
其实shell程序很类似DOS系统下的批处理程序(扩展名*.bat).
下面是在windows下利用批处理程序bat开发的备份网站及数据库数据的脚步:
命令历史
最基本的查看历史命令 history
history
!n 编号为n的历史命令
不用再复制粘贴,或者照着历史记录敲了。执行历史命令记录里面的某个命令,只需要 ! + 这条命令记录前的序号,比如
!767
这样就可以执行767序号对应的命令 ping www.tpircsboy.com
!-n 倒数第n个历史命令
你也可以用 ! - (倒数第几个命令)来执行历史命令,比如 !-1 就是倒数第一个命令, !-3就是倒数第三个命令
!-3
!! 上一条命令
!! 表示上一条命令,相当于 !-1 。
这是一个极为方便实用的命令,比如一条很长的命令而且需要管理员权限,但是好不容易敲完但忘记加sudo,这里就可以直接用 sudo !!来完成刚刚的那条复杂的命令加sudo
sudo !!
!keyword 查找包含该keyword的历史命令
如果想查找包含某个关键字的历史命令,可以这样做
!keyword
查找包含keyword的历史命令,然后回车就能执行这条历史命令
但是其实这个操作是很危险的,假如你看错或者记混了历史命令,在回车前你其实不知道要查找出的是哪条历史命令,而回车后这条命令就执行了,没有机会给你看一下查找出的命令具体是什么就执行了。很危险,不推荐这样做,可以使用 MagicSpace(见下文) 或者使用Ctrl + R 反向查找 (推荐)
Ctrl + R 反向查找命令
快捷键Ctrl + R ,然后输入要查找的关键字,输入的同时,bash就会动态地增量搜索,找到想要的历史命令后可以按回车执行,或者esc把这条提取命令出来但是不执行。再按Ctrl + R 则继续往后查找符合条件的命令。
history | grep keyword 列出所有符合条件的命令
Ctrl + R 无疑是最方便常用的历史记录搜索方式,但是当然也可以用 history | grep keyword 来查找所有的符合条件的记录,然后再结合刚刚的! 方法完成命令。
注意,以上所说的包含 ! 的技巧都是可以与别的命令拼接在一起的, 比如
sudo !-3 , time !472, sudo !apt
下面是一些关于历史记录的参数的技巧:
!$ 上一条命令的最后一条参数
如果说你只想用上条命令的参数,一个个打出来又太繁复,就可以这样
cd !$
当然这种情形下也有更简单的方法,等讲到快捷键部分再说
!^ 上一条命令的第一个参数
$ 表示最后一个参数,而 ^就表示的是第一个参数
!^ 在这样的一个应用场景里十分方便:你刚备份了一个配置文件,然后想编辑这个配置文件
vim !^
:n 第n个参数
^与$表示第一个参数和最后一个参数,而 :n 就表示第n个参数,比如 !:2就表示上一条命令的第2个参数
cd !:2
注意,参数符号不仅是可以 !$、!^、!:n 这样用,这些关于参数的符号都是可以和!表达式任意组合使用的,比如
-
cd !762:2 (表示762号历史命令的第2个参数)
-
ls !-3^ (表示倒数第3个命令的第一个参数)
-
dpkg -L !apt$ (表示搜索含apt的命令的最后一个参数)
magic-space 让历史记录表达式和参数符号立即显出原形
虽然历史记录表达式和参数符号使用起来简易方便,但是在包含这些表达式和符号的命令回车执行之前,你是并不知道这些表达式和符号到底代表的什么。为了解决这个问题,我们可以使用Magic-Space
bind Space:magic-space
使用了这个设置后,在bash中输入历史记录表达式和参数符号后,按一下空格,这些表达式和符号就立即变成它们所代表的历史命令和参数,简称magic space。
可以把这句放到.bashrc中,让设置持久生效(Mac是在.bash_profile)。
命令前加空格,使之不计入history
在命令前加空格,就可以避免改该命令计入history,小伙伴们就可以在不用清空history的前提下干一些坏事了。
HISTSIZE=0 不记录命令
如果不想记录命令,可以设置HISTSIZE=0。如果想恢复,可以在设置HISTSIZE为一个大于零的值(默认为500或者1000)
HISTCONTROL=ignoredups 去除重复命令
这样设置后,多次的同样的命令连续执行就会只记录一次。
命令补全和别名
命令补全
Tab不仅可以补全命令也可以补全文件路径 当遇到开头一样,多个文件的时候,按两下,显示匹配信息供选择。
当遇到单个文件的时候,tab键,按一下,匹配命令和参数。
centos7可以补全参数。7以前不能、需要安装一个包,重启后生效:yum install -y bash-completion
别名
-
命令语法
alias [命令别名]=[具体命令] 设置别名、 -
命令描述
alias命令用来设置指令的别名 -
命令选项
-p:打印已经设置的命令别名。(可加可不加)
unalias 取消别名 -
显示所有别名
[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 给重启服务systemctl restart network.service 做别名
[root@localhost ~]# alias restartnet='systemctl restart network.service'
[root@localhost ~]# unalias restartnet //取消别名
- 1
- 2
- 3
- alias定义别名位置 .bashrc 和 /etc/profile.d/’下
[root@localhost ~]# vi .bashrc
[root@localhost ~]# cd /etc/profile.d/
[root@localhost profile.d]# ls
通配符
[*] : 表示任意个任意字符
[root@yolks1 ~]# ls *.txt #查询以任意开头的.txt文件
1.txt 2.txt 3.txt 4.txt test_windoiws_upload_file.txt
[root@yolks1 ~]# ls *txt* #查询以任意开头任意结束,包含txt的文件
1.txt 2.txt 3.txt 4.txt test_windoiws_upload_file.txt
[?] : 一个任意字符
[root@yolks1 ~]# ls ?.txt
1.txt 2.txt 3.txt 4.txt
[[0-9]、[a-z]] : []范围内
[root@yolks1 ~]# ls [0-9].txt
1.txt 2.txt 3.txt 4.txt
[root@yolks1 ~]# ls [0-3].txt
1.txt 2.txt 3.txt
[root@yolks1 ~]# ls [0-9a-z].txt
1.txt 2.txt 3.txt 4.txt
[{1,5}] : 表示匹配{}里面列出的,类似[15]效果
[root@yolks1 ~]# ls {1,2}.txt
1.txt 2.txt
[root@yolks1 ~]# ls {1,4}.txt
1.txt 4.txt
[root@yolks1 ~]# ls {1,2,3}.txt
1.txt 2.txt 3.txt
输入输出重定向
[>] : 表示输出将前者显示的内容输出写入到后面的文件中去(注意写入到后者的文件中原文件内容将被替换)
[root@yolks1 ~]# echo "122222" > 1.txt
[root@yolks1 ~]# cat !$
cat 1.txt
122222
[>>] : 表示追加,即将前者显示的内容追加到后者文件中去且不会替换掉原文件的内容
[root@yolks1 ~]# echo "this is append context" >> 1.txt
[root@yolks1 ~]# !cat
cat 1.txt
122222
this is append context
[2>] : 表示错误输出,即将前者执行的错误结果输出到后者文件中去
[root@yolks1 ~]# teacher
-bash: teacher: 未找到命令
[root@yolks1 ~]# teacher 2> 1.txt
[root@yolks1 ~]# cat !$
cat 1.txt
-bash: teacher: 未找到命令
[2>>] : 表示追加输出,即将前者执行的错误结果追加输出到后者文件中去
[root@yolks1 ~]# car 2>> 1.txt
[root@yolks1 ~]# !cat
cat 1.txt
-bash: teacher: 未找到命令
-bash: car: 未找到命令
[&>] : 结合了正确和错误输出的结果,写入到后者文件中
[root@yolks1 ~]# ls {1,2}.txt ww.txt &> 1.txt
[root@yolks1 ~]# cat 1.txt
ls: 无法访问ww.txt: 没有那个文件或目录
1.txt
2.txt
[&>>] : 结合了正确和错误输出的结果,追加到后者文件中
[root@yolks1 ~]# ls {1,2}.txt ww.txt &>> 1.txt
[root@yolks1 ~]# !cat
cat 1.txt
ls: 无法访问ww.txt: 没有那个文件或目录
1.txt
2.txt
ls: 无法访问ww.txt: 没有那个文件或目录
1.txt
2.txt
[>和2>] : 结合使用,指定正确执行的写入到正确文件去,错误的到错误文件中去
[root@yolks1 ~]# ls [123].txt car > 1.txt 2> 3.txt
[root@yolks1 ~]# cat 1.txt 3.txt
1.txt # 来自正确的输出1.txt
2.txt # 来自正确的输出1.txt
3.txt # 来自正确的输出1.txt
ls: 无法访问car: 没有那个文件或目录 # 来自错误的输出3.txt
[<] : 输入重定向,限制格式为: 命令 < 文件
[root@yolks1 ~]# wc -l 1.txt
3 1.txt
[root@yolks1 ~]# wc -l < 1.txt
3
管道符
管道符之前介绍过,它表示把一个文件的输出内容传递给后面的命令。举个例子,见下图,
关于管道符,有很多命令是可以用的,就是把前面命令输出的结果,交给后面的命令。后面会经常用到。
作业控制
之前说过一个快捷键,ctrl + z ,表示暂停一个任务。见下图,
输入命令 vim 1.txt ,回车,进入文件 1.txt 编辑。这时候想暂时退出来做其他事情的话,就可以使用 ctrl +z 命令来停止,这时候就可以退出来回到命令窗口,做其他的事情。那么 vim 这个命令其实还在后台,怎么再调出来呢?输入命令 fg ,回车,见下图,
又进入 vim 1.txt 这个页面里。fg 就是 front ground ,到前面来的意思。
后台的运行文件可以有多个,注意上图中的数字序号,命令 jobs 可以列出后台运行的任务信息。现在要把后台运行的任务调出来的话,命令 fg 后面就要加上 id 号,例如 fg 1 或是 fg 2 。若直接输入 fg 的话,默认是跳出最后执行的一个任务。
既然有 front ground ,也就有 back ground ,命令为 bg ,调到后台去。见下图,
将 vim a.txt 任务调到后台去,就变成上图红色框框的内容,相当于在后台运行。一般使用 vim 命令是达不到这种效果的,
现在运行命令 vmstat 1 ,这个命令后面会讲到,它会自带的显示系统的状态,而且是不停的显示。按住 ctrl + z ,就可以停止命令,然后输入 fg 命令,就可以把它调回来,接着按住 ctrl + z ,就可以停止命令,再输入 bg ,
就可以让它在后台运行,在运行的过程中,也可以运行其他命令,命令输入正确即可,即使被打断了也没有关系。见下图,
可以看到 vmstat 1 在运行中。接着见下图,
输入 fg ,可以进入 vim 1.txt ,进去之后,vmstat 1 还在一直运行,输入 :q! ,强制退出,然后输入 jobs ,可以看到,只有一个任务运行。
目前为止, vmstat 1 还在后台运行,把它调到前台,输入 fg 命令,回车,就进入前台执行命令。这时候,输入其他命令就不管用了。可以按住 ctrl + c ,直接结束命令。执行命令 jobs ,就可以看到没有任务了。
刚才说到一个观点,运行一条像 vmstat 1 这样的命令时,使用 bg 命令把它调到后台去,显示成运行中,还是会运行的。但是这边 vim 的命令是不算的,因为停止一条 vim 命令,不管是在前台还是后台,都是不会运行、停止的状态。
接着介绍一个命令 sleep ,sleep 1000 表示暂停1000秒,整个工作暂停运行,1000秒之后才会恢复。见下图,
bg 就是把一条命令调到后台去运行。还有一个命令,可以不用先运行命令,就能直接在后台运行,加一个 & ,见下图,
这边说一下 xshell ,如果另外打开一个终端,运行 jobs 命令,是看不到命令的。意思就是这个终端看不到另外一个终端后台运行的命令,但是可以看到进程,输入命令 ps aux |grep sleep ,回车,
关于 ps 命令,后面还会说到。
总结:
ctrl + z 暂停一个命令
fg 调出一个命令到前台
bg 将一个命令调到后台并运行
& 在一条命令后面加上这个符号,可以直接将命令调到后台运行
sleep +时间 暂停系统多少秒
vmstat 1 不停的显示系统状态命令
shell变量
- 使用
echo
命令可以显示变量的值。
[root@centos-01 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
- 1
- 2
- 使用
env
命令即可全部列出系统预设的全部系统变量。不过登录的用户不一样,这些环境变量的值也不一样。当前显示的就是root这个账户的环境变量。
[root@centos-01 ~]# env
XDG_SESSION_ID=1
HOSTNAME=centos-01
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=5000
SSH_CLIENT=192.168.150.1 6991 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=192.168.150.1 6991 192.168.150.128 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
env
命令显示的变量只是环境变量,系统预设的变量其实还有很多,使用set
命令可以把系统预设的全部变量都显示出来。set
不仅可以显示系统预设的变量,也可以连同用户自定义的变量显示出来。
[root@centos-01 ~]# a=10010
[root@centos-01 ~]# echo $a
10010
[root@centos-01 ~]# set |grep 10010
_=10010
a=10010
- 1
- 2
- 3
- 4
- 5
- 6
-
自定义变量只能在当前Shell中生效。
-
变量名规则:字母、数字、下划线,首位不能为数字。变量值有特殊符号时需要用单引号括起来。
[root@centos-01 ~]# a=1
[root@centos-01 ~]# b=2
[root@centos-01 ~]# echo $a$b
12
[root@centos-01 ~]# a='a$bc'
[root@centos-01 ~]# echo $a$b
a$bc2
[root@centos-01 ~]# c="a$bc"
[root@centos-01 ~]# echo $c
a
[root@centos-01 ~]# c="a$b"c
[root@centos-01 ~]# echo $c
a2c
[root@centos-01 ~]# c='a$b'c
[root@centos-01 ~]# echo $c
a$bc
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 变量内容累加其他变量的内容,加双引号。
[root@centos-01 ~]# c=a"$b"c
[root@centos-01 ~]# echo $c
a2c
- 1
- 2
- 3
- 变量内容中本身带有单引号,就需要用到双引号了。
[root@centos-01 ~]# school="SDUT's"
[root@centos-01 ~]# echo $school
SDUT's
- 1
- 2
- 3
- 变量内容中需要用到其他命令运行结果,使用反引号。
[root@centos-01 ~]# pwd
/root
[root@centos-01 ~]# a=`pwd`
[root@centos-01 ~]# echo $a
/root
- 1
- 2
- 3
- 4
- 5
查看当前所在的终端
打开两个终端
- 第一个终端
[root@centos-01 ~]# echo $SSH_TTY
/dev/pts/1
- 1
- 2
- 第二个终端
[root@centos-01 ~]# w
01:05:39 up 40 min, 3 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.150.1 00:25 17:23 0.05s 0.05s -bash
root pts/1 192.168.150.1 00:50 11.00s 0.06s 0.06s -bash
root pts/2 192.168.150.1 01:05 3.00s 0.05s 0.03s w
[root@centos-01 ~]# echo $SSH_TTY
/dev/pts/2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
全局变量:export 变量名=值
[root@centos-01 ~]# school=SDUT
[root@centos-01 ~]# echo $school
SDUT
[root@centos-01 ~]# bash
[root@centos-01 ~]# echo $school
[root@centos-01 ~]# exit
exit
[root@centos-01 ~]# export school=SDUT
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
[root@centos-01 ~]# pstree
-bash: pstree: 未找到命令
[root@centos-01 ~]# yum provides /*/pstree
[root@centos-01 ~]# yum install -y psmisc
- 1
- 2
- 3
- 4
- 5
[root@centos-01 ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─agetty
├─anacron
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash───pstree
│ └─sshd───bash
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───{vmtoolsd}
[root@centos-01 ~]# bash
[root@centos-01 ~]# echo $school
SDUT
[root@centos-01 ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─agetty
├─anacron
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash───bash───pstree
│ └─sshd───bash
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───{vmtoolsd}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
在父Shell中设定全局变量,进入子Shell后,变量依然生效。但在子Shell中设定全局变量,进入父Shell后,变量无效。
[root@centos-01 ~]# bash
[root@centos-01 ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─agetty
├─anacron
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash───bash───bash───pstree
│ └─sshd───bash
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───{vmtoolsd}
[root@centos-01 ~]# export b=123456
[root@centos-01 ~]# echo $b
123456
[root@centos-01 ~]# exit
exit
[root@centos-01 ~]# echo $b
[root@centos-01 ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─agetty
├─anacron
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash───bash───pstree
│ └─sshd───bash
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───{vmtoolsd}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
取消全局变量设置
[root@centos-01 ~]# exit
exit
[root@centos-01 ~]# echo $school
SDUT
[root@centos-01 ~]# unset school
[root@centos-01 ~]# echo $school