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中是不存在的。
想让设置的环境一直存在,有两种方法:
- 允许系统内的所有用户登录后都能使用该变量:
vim /etc/profile
,最后一行加入设置的变量,然后source /etc/profile
即可生效
- 仅允许当前用户(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
的区别:
- 当你直接在机器login界面登录、使用ssh登录或su切换用户登录时,
.bash_profile
会被调用来初始化shell环境,执行一次,.bash_profile文件
默认调用.bashrc
文件; - 当你不登录系统而使用ssh直接在远端执行命令,
.bashrc
文件会被调用; - 当你已经登录系统后,每打开一个新的终端时,
.bashrc
文件都会被再次调用。
更多资料参考:
.bash_profile和.bashrc的区别