8.1 shell介绍

shell 是一个命令解释器,是系统跟计算机硬件交互时使用的中间介质,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。

每个用户都可以有自己的shell,Centos7默认安装的shell版本是bash,bash支持特定语法。此外shell还有很多种,例如zsh、ksh等。


记录命令历史

执行过的命令linux会有记录,默认记录1000条历史命令,保存在用户家目录的 .bash_history文件中。但只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存至.bash_history文件中。

# history | tail

  694  fg
  695  top end
  696  top &
  697  jobs
  698  service httpd stop
  699  /bin/systemctl stop httpd.service
  700  service httpd status
  701  init 0
  702  history
  703  history |tail# vim ~/.bash_historyservice --status-allps -auxtopfgtop endfgtop endtop &jobsservice httpd stop
/bin/systemctl stop httpd.serviceservice httpd status
init 0

 

可以看到root用户的命令历史记录保存在 ~/.bash_history文件中。

history -c用于清空内存中的当前命令历史。

# history -c# history
  1  history

 

此外,命令历史的最大记录数可由 $HISTSIZE来定义,$HISTSIZE可以在/etc/profile文件中修改。

# vim /etc/profileHOSTNAME=`/usr/bin/hostname 2>/dev/null`HISTSIZE=1000

 

$HISTTIMEFORMAT改变命令历史格式,记录命令执行的时间。

# vim /etc/profileHISTTIMEFORMAT="%Y/%m/%d %H:%M:%S"

 

永久保存命令历史:

# chattr +a ~/.bash_history

 

!!连续两个!表示执行上一条指令:

# lsanaconda-ks.cfg# !!lsanaconda-ks.cfg

 

另外,!n这里n代表数字,表示执行命令历史中的第n条指令。

# history |grep 664
  664  echo $?  
  707  history |grep 664  

# !664 echo $?0

 

!字符串表示执行命令历史中最近一次以该字符串开头的命令(字符串不可为空)。

# !catcat /etc/motd

 


命令和文件名补全

tab键
敲一下 可以将命令或路径、文件名补全;
敲两下 显示所有相同关键词开头的命令或路径、文件名。

如果没有参数补全的功能,可以安装bash -completion

# yum install -y bash -completion && source /etc/profile

 


别名

alias命令别名,一般在命令比较长的时候可以给它取别名,方便使用。

可以在这两个目录中定义命令别名:.bashrc/etc/profile

直接执行alias命令,可以看到目前系统预设的别名:

# aliasalias 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'

 

自定义命令别名:alias 命令别名='具体命令'

取消别名:unalias 命令别名


通配符

在bash下,

*		表示任意个任意字符

?		表示一个任意字符

 


输入/输出重定向

输入重定向 <:用于改变命令的输入;输出重定向 >:用于改变命令的输出。

此外,还有追加重定向 >>错误重定向 2>追加错误重定向 2>>


管道符

管道符 |:用于将前一个命令的输出作为后一个命令的输入。

# yum list | grep vimvim-common.x86_64                         2:7.4.160-4.el7                @base
vim-enhanced.x86_64                       2:7.4.160-4.el7                @base
vim-filesystem.x86_64                     2:7.4.160-4.el7                @base
vim-minimal.x86_64                        2:7.4.160-4.el7                @base
beakerlib-vim-syntax.noarch               1.17-13.el7                    epel
fluxbox-vim-syntax.noarch                 1.3.7-1.el7                    epel
neovim.x86_64                             0.2.0-2.el7                    epel
protobuf-vim.x86_64                       2.5.0-8.el7                    base
python2-neovim.noarch                     0.1.13-3.el7                   epel
python34-neovim.noarch                    0.1.13-3.el7                   epel
vim-X11.x86_64                            2:7.4.160-4.el7                base
vim-fugitive.noarch                       2.2-8.el7                      epel
vim-go.x86_64                             1.8-3.el7                      epel
vim-gtk-syntax.noarch                     20130716-1.el7                 epel
vim-halibut.noarch                        1.2-1.el7                      epel
vim-jellybeans.noarch                     1.6-1.el7                      epel
vim-toml.noarch                           0-0.1.20180306git624f024.el7   epel
vim-vimoutliner.noarch                    0.4.0-8.el7                    epel
xtuple-csvimp.x86_64                      0.5.4-8.el7                    epel
xtuple-csvimp-devel.x86_64                0.5.4-8.el7                    epel

 


作业控制

当前运行进程时,可以使它:

暂停			Ctrl+Z

恢复			fg

后台运行		bg

终止			Ctrl+C

 

jobs:查看后台的任务
命令 &:直接后台运行该命令(会显示PID信息)
ps aux:可用于查找进程
kill:结束进程,后面直接跟PID即可(结束不了时,可以强行结束,即 kill -9 pid)


8.2 变量

通常,shell预设的变量都是大写的。


命令env

使用env命令,可以列出系统预设的全部系统变量:

# env | tailLANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=192.168.100.1 63740 192.168.100.128 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env

 

当前显示的是root账户的环境变量。

常见的环境变量:

HOSTNAME			表示主机的名称  
SHELL				表示当前用户的shell类型  
HISTSIZE			表示历史命令记录数  
MAIL				表示当前用户的邮件存放目录  
PATH				该变量决定了shell将到那些目录中寻找命令或程序  
PWD					表示当前目录  
LANG				与语言相关的环境变量,多语言环境可以修改此环境变量  
HOME				表示当前用户的家目录  
LOGNAME				表示当前用户的登录名

 


命令set

env命令显示的变量只是环境变量,而set命令可以系统预设的全部变量都显示出来。

# set |tailSSH_CLIENT='192.168.100.1 63740 22'SSH_CONNECTION='192.168.100.1 63740 192.168.100.128 22'SSH_TTY=/dev/pts/0
TERM=xterm
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=1
_=colors=/root/.dircolors

 

set命令不仅可以显示系统预设的变量,还可以显示用户的自定义变量:

# myname=lzx  # echo $myname  lzx  

# set | grep lzx_=lzx  
myname=lzx

 

上面设置的环境变量在新的shell中是不存在的。

想让设置的环境一直存在,有两种方法:

  1. 允许系统内的所有用户登录后都能使用该变量:

vim /etc/profile,最后一行加入设置的变量,然后source /etc/profile即可生效

  1. 仅允许当前用户(root)使用该变量:

vim ~./bashrc,最后一行加入设置的变量,然后source ./bashrc即可生效

此处source命令的作用是将当前的设定配置刷新,即不用注销再登录也能生效。

在linux下设置自定义变量,有以下规则:

1. 设定变量的格式为a=b,其中a为变量名,b为变量内容,等号两边不能有空格

2. 变量名只能由字母、数字及下划线组成,不能以数字开头

3. 当变量内容带有特殊字符(如空格)时,需要加上单引号

4. 当变量内容中本身带有单引号时,需要加上双引号

5. 当变量内容中需要用到其他命令时,运行结果可以使用反引号

6. 当变量内容累加其它变量的内容时,需要加上双引号

 

单引号和双引号的区别

使用双引号时,不会取消双引号中特殊字符本身的作用(比如$);而使用单引号时,里面的特殊字符将全部失去其本身的作用。

pstree命令可以把linux系统中的所有进程以树形结构显示出来。

  • 安装pstree:
# yum install -y psmisc# pstreesystemd─┬─NetworkManager───2*[{NetworkManager}]  
        ├─agetty  
        ├─anacron  
        ├─auditd───{auditd}  
        ├─chronyd  
        ├─crond  
        ├─dbus-daemon───{dbus-daemon}  
        ├─firewalld───{firewalld}  
        ├─irqbalance  
        ├─master─┬─pickup  
        │        └─qmgr  
        ├─polkitd───5*[{polkitd}]  
        ├─rsyslogd───2*[{rsyslogd}]  
        ├─**sshd───sshd───bash───pstree**  
        ├─systemd-journal  
        ├─systemd-logind  
        ├─systemd-udevd  
        └─tuned───4*[{tuned}]

 

在父shell中设定变量后,在子shell中该变量是不会生效的,如果想让它生效,则要用到export命令。export命令的作用就是声明变量,让该shell的子shell也知道该变量。

设置变量之后,如果想要取消,输入unset 变量名即可。


8.3 系统/个人环境变量的配置文件

  • 系统配置文件:
/etc/profile	该文件预设了几个重要变量,例如PATH、USER、LOGNAME、MAIL、INPUTRC、HOSTNAME、HISTSIZE、umask等

/etc/bashrc		这个文件主要预设umask和PS1,PS1即输入命令时前面的那串字符

 

# echo $PS1  [\u@\h \W]\$

 

上面\u指用户,\h指主机名,\W指当前目录、\$指字符#(如果是普通用户,则是$)

除了两个系统配置文件外,每个用户主目录下还有以下几个隐藏文件:

.bash_profile		该文件定义了用户的个人化路径与环境变量的文件名称。
					每个用户都可以使用该文件输入专属于自己的shell信息,当用户登录时,该文件仅仅执行一次

.bashrc				该文件包含专属于自己的shell的bash信息,**当登录或每次打开新的shell时,该文件会被读取

.bash_history		该文件用于记录命令历史

.bash_logout		当退出shell时,会执行该文件

 

.bash_profile./bashrc的区别:

  1. 当你直接在机器login界面登录、使用ssh登录或su切换用户登录时,.bash_profile会被调用来初始化shell环境,执行一次,.bash_profile文件默认调用.bashrc文件;
  2. 当你不登录系统而使用ssh直接在远端执行命令,.bashrc文件会被调用;
  3. 当你已经登录系统后,每打开一个新的终端时,.bashrc文件都会被再次调用。

更多资料参考:

.bash_profile和.bashrc的区别