第八章 Shell基础知识

一、shell介绍

二、命令历史

三、命令补全和别名

四、通配符

五、输入输出重定向

六、管道符和作业控制

七、shell变量

八、环境变量配置文件

一、shell介绍

1.1什么shell?

  • ①shell是系统跟计算机硬件监护室使用的中间介质,它只是系统的一个工具。
  • ②shell是一个命令解释器,提供用户和机器之间的交互。用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。例:在Linux中,输入用户账号密码,进去的界面就是一个shell。
  • ③每个用户都可以有自己特定的shell(用户配置,/etc/passwd最后一段就是用户的shell)
  • ④Centos7默认的shell为bash(Bourne Again Shell)。它是sh(Bourne shell)的增强版,Bourne是开发创始人。
  • ⑤支持特定语法,比如逻辑判断、循环等
  • ⑥还有ksh、zsh等

注:Linux的shell简单说就是一个命令行和用户交互的过程,打命令就会出现结果。类似Windows下的cmd窗口。

二、命令历史

2.1我们执行过的命令Linux都会记录,预设可以记录1000条历史命令。这些命令保存在用户的家目录.bash_history中。

2.2历史命令

2.2.1 history 命令用法

  • history命令:表示之前输入的命令。
  • 存放位置:存放在用户家目录下 .bash_history
  • 默认历史记录记录1000条(有时会显示大于1000,例如1005,因为命令暂时存放在内存中,为写入文件)
  • 写入的命令需要在退出终端后才会写入文件中,不然会存放在内存里,非正常退出终端时,命令不会保存
  • #cat .bash_history显示命令历史信息
  • history n:n表示数字,列出最近的 n条命令
  • history -c::清除当前内存内的全部命令历史,不会清除配置文件
  • history -r::将 history 文件中的命令记忆读出到当前内存中 (一般登录时会自动进行)
  • history -w:将目前的内存中的命令记忆写入 history 文件中 (即强制写入,一般登出时会自动执行)

2.2.2变量

  • 变量HISTSIZE:配置命令历史记录条数
  • echo $HISTSIZE :输出HISTSZIE的值
  • /etc/profile:存储变量文件。可在/etc/profile中修改变量信息,修改后#soure /etc/profile才能生效
  • HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S":进行history时,输出的仅有序列号和命令,没有运行时间,这时需要定义HISTTIMEFORMAT格式。(HISTTIMEFORMAT定义后,仅在当前用户下生效,想要在其他用户或终端下执行,需要在/etc/profile中修改,添加HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S"这一项,并#soure /etc/profile,生效
  • 永久保存命令历史:chattr +a ~/.bash_history(a权限表示只能追加,不能删除)。如果需要永久保存命令历史,执行这条命令后,HISTSIZE可以不修改

2.2.3使用技巧

  • !n: 执行 history 命令显示的 第n条命令
  • !! :执行上一条命令
  • !word: 在命令历史是倒着查找并执行最近的一条以word字符串开头的命令

三、命令补全和别名

3.1命令补全

Tab键:按一下补全以某个字符开头的命令;按两下,列出以某个字符开头的所有命令

参数补全:centos7支持参数补全,需要安装bash_completion。安装后重启或Ctrl+d断开终端重新连接后生效

3.2别名

我们看一看通过alias把一个常用的并且很长的命令另取为一个简单易记的指令。

  • 直接执行alias:查看当前已经存在的命令别名
  • 自定义命令别名,格式:alias 【命令别名】=‘具体的命令’
  • 每个用户都有自己配置别名的文件:存放在用户家目录下的~/.bashrc中
  • 自定义的别名,只针对当前用户生效,在其他用户或终端不生效;想要在其他用户或终端下生效,需要在/etc/profile.d中修改。
  • ls /etc/profile.d
  • unalias 别名:取消别名

注:alias重启后会失效,可以在/etc/bashrc或用户家目录下的.bashrxc中修改

四、通配符

  • 通配符

符号

意义

*

代表0-无穷个 任意字符

?

代表有且只有一个字符,例22.txt就不会识别

[ ]

或的意思,匹配一个就可以。仅有一个字符,且为[...]中所枚举的其中一个, 如 [13579]

[-]

或的意思,匹配一个就可以。只不过是一个范围,如[ 0-9 ],[a-z]等

[^]

非的意思,有且仅有一个,且不是所枚举的任何字符,如:[^a-zA-Z] 代表该位不是字母

  • 特殊符号

符号

内容

#

批注号

\

转义符号,将特殊字符或通配符还原成一般字符

|

管道符

;

命令衔接符,连续执行两条命令

~

当前用户家目录

$

取用变量符号

&

工作控制,将指令变成后台工作

!

逻辑非

>、>>

数据流重定向,output

<、<<

数据流重定向,input

' '

单引号,无法引用变量

" "

双引号,可以引用变量

` `

指令引用,功能同 $(command)

五、输入输出重定向

5.1输入输出重定向

  • >:输出重定向。把前面的执行结果输出至文件 or 设备。(会覆盖之前的内容)
  • >>:输出重定向。把前面的执行结果输出至文件 or 设备。(追加到之前内容的后面)
  • <:输入重定向。把后面的执行结果输入到前面的命令中。(前面必须是命令)例:wc -l <1.txt
  • <<:输入重定向。把后面的执行结果输入到前面的命令中。需要配合>使用,(以 Ctrl + d 结束)。例:

5.2错误输入输出重定向

  • 2>:错误输出重定向。把前面的执行结果输出至文件 or 设备。(会覆盖之前的内容)
  • 2>>:错误输出重定向。把前面的执行结果输出至文件 or 设备。(追加到之前内容的后面)
  • >+2>:把正确信息输入到一个文件中,错误信息输入到一个文件中,可以输入到同一个文件(会覆盖之前的内容)
  • >+2>==&>
  • >>+2>>:把正确信息输入到一个文件中,错误信息输入到一个文件中,可以输入到同一个文件(追加到之前内容的后面)
  • >>+2>>==&>>

5.3巧用垃圾桶(黑洞)

Linux 下有一个特殊的设备 /dev/null ,所有被写入该设备的东西都会消失,所以如果有部分信息不想输出至文件,也不想输出至屏幕,那就输出至 /dev/null 吧

六、管道符和作业控制

6.1管道符:把前面的结果输入到后面的命令。

管道的概念与数据流重定向不同,管道只是在输出至屏幕前多加一道工序,而配合管道的这些工序,往往是字符处理软件。

例子:

  •   ls /etc/ | more # 原本要直接输出至屏幕的信息, 用 more 进行了加工
  •   ls /etc/ | grep "bash" # 原本直接输出至屏幕的信息, 用 grep "bash" 进行了加工, 筛选出了关键字

6.2作业控制

6.2.1基本概念

  • foreground: 前台, 平常执行命令的界面
  • background: 后台, 看不到的地方
  • 什么样的工作适合放到后台: 不需要与用户交互的命令
  • 放入后台的工作是无法用 Ctrl + c 来终止的
  • 后台的工作有两种状态: 暂停(stop) 和 运行中( running)

6.2.2用法

  • ctrl+z:将正在运行的命令扔到后台,且置为暂停(任何正在执行的任务, 在按下 ctrl+z 后, 都会被扔到后台, 且置为"暂停"状态代码中看到每暂停一个工作, 提示信息里就显示一个数字和一个加号, 数字表示改任务目前在后台的编号, 而加号则代表该任务是最新的一个被扔后台的任务)

  • jobs:查看后台中的任务(包括已暂停的,且只在当前终端下有效)
  • 加号: 最新被扔进来的
  • 减号: 次新被扔进来的
  • 更早被扔进来的就不带符号了

  • jobs 的选项:
  • -l:同时列出任务的 PID
  • -r: 仅列出后台中处于 "running" 的任务
  • -s: 仅列出后台中处于 "stop" 的任务

  • fg【id】:将后台工作拿回到前台来;不加任务号则将带加号的拿回来  ​​​
  • bg【id】:把任务调到后台/将后台暂停的任务激活;不加任务号则将在后台激活带加号的任务
  • 命令后加&直接把命令丢到后台

6.2.3其他方法

如果想要直接移除后台的任务怎么做?

---用 kill

kill 命令:

  •  kill 的用法

kill -<signal> %<job_num>或kill -<signal> <PID>

常用 signal

  • -1: 重新读取参数的配置文件(类似 reload)
  • -9: 立即强制删除一个任务
  • -15: 以正常方式结束一个任务

pkill用法:

pkill 进程名   :删除进程

6.2.4 #vmstat 1 :会不停的显示系统信息(过程中可以敲命令,但是命令窗口会被系统信息替换),以Ctrl+z退出

6.2.5 #ps aux 获取进程ID

七、shell变量

7.1 变量的种类

  • 环境变量

往往以纯大写来命名, bash 的子进程中仍可使用

  • 自定义变量

推荐使用纯小写来命名, 不经过声明, 则在 bash 的子进程中无法使用

7.2 变量的命名

由字母、数字、下划线组成,且只能以非数字开头

7.3 自定义变量

语法:变量名=变量值

注意-1:如果变量值中存在空格,需要用单引号或双引号将变量值括起来

注意-2:如果变量值中有引用其他变量,需要用双引号将变量值括起来(单引号认为特殊符号为字符,而不是变量的前缀

7.4 查看变量信息

7.4.1env

功能:查看环境变量

7.4.2 set

set命令查看到的变量包含了自定义变量

7.5变量的累加

7.5.1 echo

功能:打印变量的内容

7.6 export

功能:将变量转换为环境变量

7.7 unset 变量名:取消变量

7.8 declare

用法:

declare [-aixr] <var_name>

选项:

  • -a:定义变量为数组
  • -i:定义变量为纯数字
  • -x:定义变量为环境变量
  • -r:定义变量为 readonly

7.9 常用环境变量

  • HOME: 当前用户的家目录
  • HOSTNAME: 该主机的主机名
  • USER: 当前用户的用户名
  • SHELL: 当前使用的 shell 类型
  • HISTSIZE: 可存储的历史命令条数
  • MAIL: 当前用户的邮箱
  • PATH: 可执行命令的所在目录
  • LANG: 当前语系
  • PS1: 命令提示符的格式, 可玩性较高, 但工作中不常用, 可自行 man bash 查看 PS1 的设置方法
  • PS2: 输入命令时强制换行后的提示符
  • OSTYPE: 当前操作系统类型
  • MACHTYPE: 安装的机器类型
  • HOSTTYPE: 主机的位数, x86 还是 x86_64

八、环境变量配置文件

8.1 login 与 non-login

login shell:取得 bash 时需要完整的登录流程。如由 tty1-tty6登录时,需要输入用户的账号和密码

读取的文件:

  • /etc/profile :系统整体的设定,对所有用户皆生效
  • ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:用户的个人设定

8.2 non-login shell:

取得 bash 接口的方法不需要重复登录的举动,如在 bash 环境下,再次执行bash命令进入子 shell 时,不需要输入账号和密码

8.3 /etc/profile (login shell)

该文件会根据用户的 UID 设定好许多环境变量以及参数

8.3.1 设定环境变量

  • PATH:根据 UID 决定PATH 变量是否要包含 sbin 目录
  • USER:根据 id 命令的结果,显示用户名
  • LOGNAME:等于 USER
  • MAIL:配置好用户的邮箱
  • HOSTNAME:根据 hostname 指令,决定该变量值
  • HISTSIZE:直接设定历史命令记录的条数为 1000

8.3.2调用 /etc/profile.d/*.sh

/etc/profile.d/ 下的脚本,主要是进行 bash 颜色、语系、vi 的别名、which 的别名等设置

8.4 ~/.bash_profile (login shell)

bash shell 读取完通用配置后,才开始进行用户个性化配置的读取。

其实用户个性化配置的文件不止 ~/.bash_profile 一个,还可能有 ~/.bahs_login 和 ~/.profile

为什么有这么多个性化配置文件呢?主要是为了给从其他种类的 shell 转来使用 bash 的用户提供便利,满足其习惯罢了。

所以我们往往只能见到 ~/.bash_profile 而已

8.4.1 三种文件的读取顺序及规律

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

其实 bash 的 login shell 只会读取上述文件中的其中一个, 读取顺序依照上面的排序, 一旦读取到其中一个文件, 就不再继续读取其余文件

8.4.2 ~/.bash_profile 内容

~/.bash_profile 调取了 ~/.bashrc 文件, 并将 ~/bin 目录加入到 PATH 变量中

8.5 ~/.bashrc (non-login shell)

当通过 non-login shell 取得 bash 后, 仅会读取 ~/.bashrc 文件

先来看看 ~/.bashrc 的内容吧

定义了几个别名, 然后又调用了 /etc/bashrc

/etc/bashrc 会完成以下任务

  • 根据不同的 UID 设置 umask 值
  • 根据不同的 UID 设置 PS1 变量
  • 调用 /etc/profile.d/*.sh

注: 如果家目录下没有 .bashrc 文件, 那么你的 bash 提示符可能会变成如下样子

-bash-4.2#

猜你喜欢

转载自blog.csdn.net/dwy2018/article/details/81704688