shell基础知识(一)

8.1 shell介绍

shell 是一个命令解释器,是系统跟计算机硬件交互时使用的中间介质,用户把指令告诉 shell,然后 shell 再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。
每个用户都可以有自己的 shell, Centos7默认安装的 shell 版本是 bashbash支持特定语法。此外shell还有很多种,例如zsh、ksh等。

8.1.1 记录命令历史

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

[root@localhost ~]# 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_history :

service –status-all
ps -aux
top
fg
top end
fg
top end
top &
jobs
service httpd stop
/bin/systemctl stop httpd.service
service httpd status
init 0

可以看到命令历史记录保存在 ./bash_history文件中

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

702 history
703 history |tail
704 vim .bash_history
705 vim /etc/profile
706 history
[root@localhost ~]# history -c
[root@localhost ~]# history
1 history

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

[root@localhost ~]# vim /etc/profile
HOSTNAME=/usr/bin/hostname 2>/dev/null \\这里有反引号
HISTSIZE=1000

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

HISTTIMEFORMAT=”%Y/%m/%d %H:%M:%S”

永久保存命令历史

chattr +a ~/.bash_history

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

[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# !!
ls
anaconda-ks.cfg

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

[root@localhost ~]# history |grep 664
664 echo $?
707 history |grep 664
[root@localhost ~]# !664
echo $?
0

!字符串(字符串大于等于1) 表示执行命令历史中最近一次以该字符串开头的命令

[root@localhost ~]# !cat
cat /etc/motd

8.1.2 命令和文件名补全

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

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

yum install -y bash -completion

8.1.3 别名

alias 命令别名,一般在命令比较长的时候可以给它取别名,方便使用
可以在这两个目录中定义alias.bashrc 、/etc/profile

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

[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’

自定义命令别名:alias[命令别名]=[‘具体命令’]
取消别名 unalias

8.1.4 通配符

在bash下,
* 表示任意个任意字符
? 表示一个任意字符

8.1.5 输入/输出重定向

输入重定向 < 用于改变命令的输入
输出重定向 > 用于改变命令的输出
此外,还有追加重定向 >>错误重定向 2>追加错误重定向 2>>

8.1.6 管道符

| 管道符,用于将前一个指令的输出作为后一个指令的输入

[root@localhost ~]#yum list |grep vim
vim-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

8.1.7 作业控制

当前运行进程时,可以使它
**暂停 Ctrl+Z
恢复 fg
后台运行 bg
终止 Ctrl+C**

jobs 查看后台的任务
命令后面加& 直接丢到后台运行(会显示pid信息)
ps aux 可用于查找进程
kill 结束进程,后面直接跟pid即可(结束不了时,可以加一个选项,即 kill -9 [pid])


8.2 变量

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

8.2.1 命令env

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

[root@localhost ~]# env |tail
LANG=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 表示当前用户的登录名

8.2.2 命令set

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

[root@localhost ~]# set |tail
SSH_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命令不仅可以显示系统预设的变量,还可以显示用户的自定义变量

[root@localhost ~]# myname=lzx
[root@localhost ~]# echo $myname
lzx
[root@localhost ~]# set |grep lzx
_=lzx
myname=lzx

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

想让设置的环境一直存在,有两种方法:
1. 允许系统内的所有用户登录后都能使用该变量:

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


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

vim ~./bashrc ,最后一行加入设置的变量,然后source ./bashrc 即可生效
此处source命令的作用是将当前的设定配置刷新,即不用注销再登录也能生效

在linux下设置自定义变量,有以下规则:
1. 设定变量的格式为a=b,其中a为变量名,b为变量内容,等号两边不能有空格
2. 变量名只能由字母、数字及下划线组成,不能以数字开头
3. 当变量内容带有特殊字符(如空格)时,需要加上单引号
4. 当变量内容中本身带有单引号时,需要加上双引号
5. 当变量内容中需要用到其他命令时,运行结果可以使用反引号
6. 当变量内容累加其它变量的内容时,需要加上双引号

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

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

yum install -y psmisc

[root@localhost ~]# pstree
systemd─┬─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 这个文件主要预设umaskPS1PS1即输入命令时前面的那串字符

[root@localhost ~]# 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. 当你已经登录系统后,每打开一个新的Termina时,.bashrc文件都会被再次调用

更多参考: .bash_profile和.bashrc的区别

猜你喜欢

转载自blog.csdn.net/miss1181248983/article/details/80547392
今日推荐