Linux Shell 基础知识(一)

时间:2023-03-08 22:39:48
Linux Shell 基础知识(一)

1. 本文知识结构

Linux Shell 基础知识(一)

2. shell 基础知识

2.1 shell 简单介绍

GNU bash shell 能提供对 Linux 系统的交互式访问,一般来说,使用快捷键 Ctrl + Alt + T 即可打开 Linux Terminal 。

/etc/passwd 文件包含所有系统用户账户列表以及每个用户的基本配置信息,从该文件中可以找到各用户使用的默认 shell 程序。

​ 大多数 Linux 发行版自带用以查找 shell 命令以及其他 GNU 工具信息的在线手册。man 命令常用于访问存储在 Linux 系统上的手册页面。 man man 命令可用来查看手册页相关的手册页。如果存在不记得命令名的情况,可用 man -k keyword 命令来查找与 keyword 相关的命令,譬如 man -k terminal 即为查找与终端相关的命令。

​ 手册页不是唯一的参考资料,另外还有 info 页面信息,执行 info info 可了解 info 页面的相关内容。另外,大多数命令都可通过 -help 或 --help 命令获取帮助信息,譬如 help help

2.2 linux 文件系统

​ 不同于 Windows 为每个物理磁盘驱动器分配一个盘符,Linux 在获取路径时不涉及到驱动器盘符,其文件存储在虚拟目录(virtual directory)。虚拟目录将安装在PC上的所有存储设备的文件路径纳入单个目录结构中。

​ Linux PC 上安装的第一块一盘称为根驱动器,根驱动器包含了虚拟目录的核心,其他目录都是由此开始构建的。Linux 在根驱动器上创建一些挂载点(mount point),这些挂载点是虚拟目录中用于分配额外存储设备的目录,通过把文件和目录挂载到挂载点目录中,实现另一驱动器与根驱动器的协同存储文件。通常系统文件会存储在根驱动器中,而用户文件则存储在另一驱动器中。

Linux Shell 基础知识(一)

​ 常见的 Linux 顶层虚拟目录名及其内容见下表:

目录 用途
/ 虚拟目录的根目录,通常不会在此存储文件
/bin 二进制目录,存放了用户级的GNU工具
/boot 启动目录,存放启动文件
/dev 设备目录,Linux在这里创建设备节点
/etc 系统配置文件目录
/home 主目录,Linux在这里创建用户目录
/lib 库目录,存放系统和应用程序的库文件
/media 媒体目录,可移动媒体设备的常用挂载点
/mnt 挂载目录,另一可移动媒体设备的常用挂载点
/opt 可选目录,常用于存放第三方软件包和数据文件
/proc 进程目录,存放现有硬件及当前进程的相关信息
/root root用户的主目录
/sbin 系统二进制目录,存放许多GNU管理员级工具
/run 运行目录,存放系统运作时的运行时数据
/srv 服务目录,存放本地服务的相关文件
/sys 系统目录,存放系统硬件信息的相关文件
/tmp 临时目录,可以在该目录中创建和删除临时工作文件
/usr 用户二进制目录,大量用户级的GNU工具和数据文件都存储在这里
/var 可变目录,用以存放经常变化的文件,比如日志文件
    这些常见的目录名均基于**文件系统层级标准(filesystem hierarchy standard, FHS)**。Linux 发行版大多遵循了FHS,但由于FHS偶有更新,可能存在标准未同步的情况。

绝对文件路径定义了在虚拟目录结构中该目录的确切位置,以虚拟目录的根目录开始,相当于目录的全名。相对文件路径允许用户指定一个基于当前位置的目标文件路劲,它不以代表根目录的正斜线(/)开头,而是以目录名(当前工作目录下的一个子目录)或一个特殊的字符(常见的以单点符或双点符为主)开始。特殊字符的含义如下:

  • 单点符( . ),表示当前目录
  • 双点符( . . ),表示当前目录的父目录

2.3 常用 shell 文件命令

​ 常用的shell 文件命令清单

命令 用途
cd 切换目录
pwd 显示当前工作目录
ls 显示当前目录下的文件和目录
touch 创建空文件或改变文件修改时间
cp 从源对象复制到目标对象
ln 创建符号链接或硬链接
mv 将文件和目录移动到另一个位置或重新命名
rm 删除文件或目录
mkdir 创建目录
rmdir 删除目录
file 探测文件内部,决定文件类型
cat 显示文本文件的内容
more 显示文本文件的内容,每次显示一页(分页工具)
less more命令的升级版
tail 显示文件最后几行的内容
head 显示文件开头几行的内容

​ 文件和目录列表操作

  • 遍历目录
#切换目录
$ cd destination #显示当前目录
$ pwd

​ destination 参数可以两种方式表示:绝对文件路径与相对文件路径

  • 列表命令(ls)
#显示当前目录下的目录和文件
$ ls #用正斜线(/)和(*)区分显示当前目录下的目录和文件
$ ls -F #显示当前目录下的目录和文件(包括隐藏文件,隐藏文件以点号开头)
$ ls -a #递归显示当前目录下的目录和文件(包含子目录下的文件)
$ ls -R #显示长列表(包含文件的更多相关信息,时间列默认为修改时间)
$ ls -l #查看test_file的详细信息,其中时间列为访问时间
$ ls -l --time=atime test_file #另外,与linux常用短命令相同,它支持将多个参数结合使用,比如
$ ls -alF
  • 通配符

​ 问号( ? )代表一个字符;

​ 星号( * )代表零个或多个字符。

文件扩展匹配(file globbing),指的是使用通配符进行模式匹配的过程。除星号、问号之外,还有更多的元字符通配符用于文件扩展匹配,比如中括号( [] )、感叹号( ! )等。

  • 文件处理
#文件不存在时,创建一个空文件,文件存在时,更新文件的修改时间
$ touch test_file #复制文件或目录
$ cp source destination #复制文件或目录,复制时强制询问是否需要覆盖已有文件
$ cp -i source destination #递归复制文件或目录
$ cp -R source destination #将文件和目录移动到另一个位置或者重新命名
$ mv source destination #将文件和目录移动到另一个位置或者重新命名,操作时强制询问
$ mv -i source destination #删除文件(加入参数 -i 实现在删除前询问)
$ rm -i test_file #不受提示符打扰地删除很多文件(使用前确保文件都是你想要删除的)
$ rm -f test_file*

​ 制表键(Tab)自动补全允许你在输入文件名或目录名时按一下制表键,让shell帮忙将内容补充完整。

  • 链接文件

​ 链接文件是Linux文件系统的一个优势。如需要在系统上维护同一文件的两份或多份副本,除了保存多份单独的物理文本副本之外,还可以采用保存一份物理文件副本和多个虚拟副本的方法,这些虚拟的副本即链接。链接是目录中指向文件真实位置的占位符。在Linux中有两种不同类型的文件链接:符号链接硬链接

​ 符号链接是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。这两个通过符号链接在一起的文件,彼此内容并不相同。通过对比符号链接文件和数据文件的文件大小与inode编号均可知晓两者并非一个文件。

#为test_file创建符号链接test_file_sl
$ ln -s test_file test_file_sl #查看可与test_file*通配的文件的inode编号
$ ls -i test_file*

​ 硬链接会创建独立的虚拟文件,其中包含了原始文件的信息及位置,但是它们从根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须时间存在。

#为test_file创建硬链接test_file_hl
$ ln test_file test_file_hl #查看可与test_file*通配的文件的inode编号
$ ls -i test_file*

​ 注意:只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。同一个文件可以拥有多个链接,但不要创建软链接文件的软链接。混乱的链接链不仅会容易断裂,还会造成各种麻烦。

  • 处理目录
#创建目录
$ mkdir new_dir #创建多个目录及子目录
$ mkdir -p new_dir/sub_dir/under_dir #删除目录(默认情况下,rmdir命令只能删除空目录)
$ rmdir new_dir #删除非空目录(-i参数仅表询问,先删除目录下的文件再删除目录)
$ rm -ri new_dir #不做提示地删除目录下的子目录及文件
$ rm -rf new_dir #展示目录结构
$ tree new_dir
  • 查看文件
#查看文件类型
$ file test_file #查看文件内容
$ cat test_file #查看文件内容,所有行加上行号
$ cat -n test_file #查看文件内容,有文本行加上行号
$ cat -b test_file #查看文件内容,不出现制表符
$ cat -T test_file #显示文本文件内容,每次显示一页
$ more test_file #其他显示命令less, more命令的升级版,详讯 man less #查看文件的末尾(默认10行)
$ tail test_file #查看文件的末尾2行
$ tail -n 2 test_file
$ tail -2 test_file #查看文件的开头(默认10行)
$ head test_file #查看文件的开头10行
$ head -n 10 test_file
$ head -10 test_file

3. shell 系统交互命令

3.1 管理进程

​ 当程序运行再系统上时,我们称之为进程(process),在Linux系统中,我们可以使用 ps 命令监测进程的运行情况。

Linux系统种使用GNU ps命令支持3种不同类型的命令行参数:

  • Unix风格参数,前面加单破折线
  • BSD风格参数,前面不加破折线
  • GNU风格的长参数,前面加双破折线
#ps 命令的基本情况(进程ID/Process ID,运行终端/TTY,进程已用的CPU时间)
$ ps

​ Unix风格的 ps 命令参数

参数 描述
-A 显示所有进程
-N 显示与指定参数不符的所有进程
-a 显示除控制进程(session leader)和无终端进程外的所有进程
-d 显示除控制进程外的所有进程
-e 显示所有进程
-C cmdlist 显示包含在cmdlist列表中的进程
-G grplist 显示组ID在grplist列表中的进程
-U userlist 显示属主的用户ID 在userlist列表中的进程
-g grplist 显示会话或组ID在grplist列表中的进程
-p pidlist 显示PID在pidlist中的进程
-s sesslist 显示会话ID在sesslist列表中的进程
-t ttylist 显示终端ID在ttylist列表中的进程
-u userlist 显示有效用户ID在userlist列表中的进程
-F 显示更多额外输出(相对-f参数而言)
-O format 显示默认的输出列以及format列表指定的列
-M 显示进程的安全信息
-c 显示进程的额外调度器信息
-f 显示完整格式的输出
-j 显示任务信息
-l 显示长列表
-o format 仅显示由format指定的列
-y 不要显示进程标记(process flag,表明进程状态的标记)
-z 显示安全标签(security context)信息
-H 用层级格式来显示进程(树状,用来显示父进程)
-n namelist 定义了WCHAN列显示的值
-w 采用宽输出模式,不限宽度显示
-L 显示进程中的线程
-V 显示ps命令的版本号

​ 扩展列信息

英文简称 列描述
UID 启动这些进程的用户
PID 进程的进程ID
PPID 父进程的进程号
C 进程生命周期中的CPU利用率
STIME 进程启动时的系统时间
TTY 进程启动时的终端设备
TIME 运行进程需要的累计CPU时间
CMD 启动的程序名称
F 内核分配给进程的系统标记
S 进程的状态(O代表正在运行;S代表在休眠;R代表可运行,正等待运行;Z代表僵化,进程已结束但父进程已不存在;T代表停止)。
PRI 进程的优先级(越大的数字代表越低的优先级)
NI 谦让度值用来参与决定优先值
ADDR 进程的内存地址
SZ 假如进程被换出,所需交换空间的大致大小
WCHAN 进程休眠的内核函数的地址

​ GNU风格的ps命令参数

参数 描述
--deselect 显示所有进程,命令行中列出的进程
--Group grplist 显示组ID在grplist列表中的进程
--User userlist 显示用户ID在userlist列表中的进程
--group grplist 显示有效组ID在grplist列表中的进程
--pid pidlist 显示PID在pidlist列表中的进程
--ppid pidlist 显示父PID在pidlist列表中的进程
--sid sidlist 显示会话ID在sidlist列表中的进程
--tty ttylist 显示终端设备号在ttylist列表中的进程
--user userlist 显示有效用户ID在userlist列表中的进程
--format format 仅显示由format指定的列
--context 显示额外的安全信息
--coles n 将屏幕宽度设置为n列
--columns n 将屏幕宽度设置为n列
--cumulative 包含已停止的子进程的信息
--forest 用层级结构显示出进程和父进程之间的关系
--headers 在每页输出中都显示列的头
--no-headers 不显示列的头
--lines n 将屏幕高度设为n行
--rows n 将屏幕高度设为n排
--sort order 指定将输出按哪列排序
--width n 将屏幕宽度设为n列
--help 显示帮助信息
--info 显示调试信息
--version 显示ps命令的版本号

​ top 命令与 ps 命令像是,能够显示进程信息,但它是实时显示的。默认情况下,top 命令在启动时会按照 %CPU 值对进程排序,可以在 top 运行时使用多种交互命令重新排序。每一个交互式命令都是单字符,在 top 命令运行时键入可改变 top 的行为。键入 f 允许你选择对输出进行排序的字段,键入 d 允许你修改轮询间隔,键入 q 可以推出 top。

  • 第一行:当前时间、系统的运行时间、登录的用户数以及系统的平均负载
  • 第二行:进程概要信息/进程状态信息
  • 第三行:CPU概要信息
  • 第四行:系统物理内存状态
  • 第五行:系统交换空间状态
  • 最后一部分:当前运行中的进程的详细列表
英文简称 列描述
PID 进程的ID
USER 进程属主的名字
PR 进程的优先级
NI 进程的谦让度值
VIRT 进程占用的虚拟内存总量
RES 进程占用的物理内存总量
SHR 进程与其他进程共享的内存总量
S 进程的状态(D代表可中断的休眠状态,R代表在运行状态,S代表休眠状态,T代表跟踪状态或停止状态,Z代表僵化状态)
%CPU 进程使用的CPU时间比例
%MEM 进程使用的内存占可用内存的比例
TIME+ 自进程启动到目前为止的CPU时间总量
COMMAND 进程所对应的命令行名称,也就是启动的程序名

​ 在 Linux 中,进程之间通过信号来通信。进程的信号就是预定义好的一个消息,进程能识别它并决定忽略还是作出反应。进程如何处理信号是由开发人员通过编程来决定的

信号 名称 描述
1 HUP 挂起
2 INT 中断
3 QUIT 结束运行
9 KILL 无条件终止
11 SEGV 段错误
15 TERM 尽可能终止
17 STOP 无条件停止运行,但不终止
18 TSTP 停止或暂停,但继续在后台运行
19 CONT 在STOP或TSTP之后恢复执行
#要发送进程信息,你必须时进程的属主或登录为root用户

#kill命令可通过进程PID给进程发信号,默认为TERM信号
$ kill 3940 #kill命令可通过 -s 参数支持指定其他信号(用信号名或信号值)
$ kill -s HUP 3940 #要检察kill命令是否有效,可再运行 ps 命令或 top 命令,看看问题进程是否停止。 #killall命令支持通配符,可再系统负载过大而变得慢快速结束进程
$ killall http*

3.2 获取磁盘统计信息

​ df 命令可以方便的地查看所有已挂载的磁盘的使用情况。

​ du 命令可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况。这一方法可用来快死判断系统上某个目录下是不是有超大文件。

# 查看磁盘使用情况
$ df # 以用户易读的形式显示磁盘使用情况
$ df -h # 显示某个目录下磁盘使用情况(具体到占用磁盘块数)
$ du # 显示某个目录下磁盘使用情况(显示所有已列出文件总的大小)
$ du -c # 显示某个目录下磁盘使用情况(以用户易读的形式)
$ du -h # 显示某个目录下磁盘使用情况(显示每个输出参数的总计)
$ du -s

3.3 挂载新磁盘

​ Linux文件系统将所有磁盘都比购入一个虚拟目录下。在使用新的存储媒体之气那,需要把它放到虚拟目录下,即为挂载(mounting)。在图形化桌面环境里,大多数Linux发行版都能自动挂载特定类型的可移动存储媒体。

    默认情况下,mount 命令会输出当前系统上挂载的设备列表。
# 手动挂在媒体设备的基本命令:
$ mount -t type device directory #type参数指定了磁盘被格式化的文件系统类型,常见类型有 vfat,ntfs,iso9660;后面两个参数定义了了该存储设备的设备文件的位置以及挂载点在虚拟目录中的位置。

mount命令的参数

参数 描述
-a 挂载/etc/fstab文件中指定的所有文件系统
-f 使mount命令模拟挂载设备,但并不真的挂载
-F 与-a参数一起使用时,会同时挂载所有文件系统
-v 详细模式,将会说明挂载设备的每一步
-I 不启用任何/sbin/mount.filesystem下的文件系统帮助文件
-l 给ext2、ext3或XFS文件系统自动添加文件系统标签
-n 挂载设备,但不注册到/etc/mtab已挂载设备文件中
-p num 进行加密挂载时,从文件描述符num中获得密码短语
-s 忽略该文件系统不支持的挂载选项
-r 将设备挂载为只读的
-w 将设备挂载为可读写的
-L label 将设备按指定的label挂载
-U uuid 将设备按指定的uuid挂载
-O 和-a参数一起使用,限制命令只作用到特定的一组文件系统上
-o 给文件系统添加特定选项

-o参数允许挂载文件系统时添加一些以逗号分隔的额外选项,常见的有:

ro: 以只读形式挂载

rw: 以读写形式挂载

user: 允许普通用户挂载文件系统

check=none: 挂载文件系统时不进行完整性校验

loop: 挂载一个文件

​ 从 Linux 系统上移出一个可移动设备时,不能直接从系统上移出,而应该先卸载。umount 命令支持通过设备文件或者挂载点来指定要卸载的设备。

$ umount [directory | device ]

3.4 数据处理

  • 排序数据
#按指定的默认语言排序规则对文本文件中的数据行排序
$ sort test_file #把数字识别为数值而非字符,并按值排序
$ sort -n test_file #按月排序(Jan\Feb\Mar\Apr\...)
$ sort -M test_file

sort 命令参数

单破折线 双破折线 描述
-b --ignore-leading-blanks 排序时忽略起始的空白
-C --check=quiet 不排序,如果数据无序也不要报告
-c --check 不排序,但检查输入数据是不是已排序,未排序的话,报告
-d --dictionary-order 仅考虑空白和字母,不考虑特殊字符
-f --ignore-case 默认情况下,会将大写字母排在前面;这个参数会忽略大小写
-g --general-number-sort 按通用数值排序(跟-n不同,把值当浮点数来排序,支持科学计数法表示的值)
-i --ignore-nonprinting 载排序时忽略不可打印字符
-k --key=POS1[,POS2] 排序从POS1位置开始,如果制定了POS2的话,到POS2位置结束
-M --month-sort 用三字符月份名按月份排序
-m --merge 将两个已排序数据文件合并
-n --numeric-sort 按字符串数值来排序
-o --output=file 将排序结果写出到指定的文件中
-R --random-sort 按随机生成的散列表的键值排序
--random-source=FILE 指定-R参数用到的随机字节的源文件
-r --reverse 反序排序(升序变降序)
-S --buffer-size=SIZE 指定使用的内存大小
-s --stable 禁用最后重排序比较
-T --temporary-directory=DIR 指定一个位置来存储临时工作文件
-t --field-separator=SEP 指定一个用来区分键位置的字符
-u --unique 和-c参数一起使用时,检查严格排序;不和-c参数一起使用时,仅输出第一例相似的两行
-z --zero-terminated

​ grep命令会载输入或指定的文件中查找匹配指定模式的字符的行。grep的输出就是包含了匹配模式的行。

# 基本文件查找
$ grep [options] pattern [file] # 反向搜索
$ grep -v t file1 # 显示匹配行所在行号
$ grep -n t file1 # 统计有多少行含有匹配模式
$ grep -c t file1 # 指定多个匹配模式(满足某一个即可)
$ grep -e t -e f file1

默认情况下,grep 命令用基本的Unix风格正则表达式来匹配模式。

egrep 命令是 grep 命令的一个衍生,支持POSIX扩展正则表达式。fgrep 命令支持将匹配模式指定为用换行符分隔的一系列固定长度的字符串。

Linux文件压缩工具

工具 文件扩展名 描述
bzip2 .bz2 采用Burrows-Wheeler块排序文本压缩算法和霍夫曼编码
compress .Z 最初的Unix文件压缩工具
gzip .gz GNU压缩工具,用Lempel-Ziv编码
zip .zip Windows上PKZIP工具的Unix实现

​ gzip软件包是GNU项目的产物,意在编写一个能够替代原先Unix中compress工具的免费版本。其中含有以下工具:

    - gzip:  压缩文件

    - gzcat:  查看压缩过的文本文件内容

    - gunzip:  解压文件

​ tar 命令是给整个目录结构创建归档文件的简便方法,是Linux中分发开源程序源码文件所采用的普遍方法。

# tar命令的格式
$ tar function [options] object1 object2 ...

tar命令的功能function

功能 长名称 描述
-A --concatenate 将一个已有tar归档文件追加到另一个已有tar归档文件
-c --create 创建一个新的tar归档文件
-d --diff 检查归档文件和文件系统的不同之处
--delete 从已有tar归档文件中删除
-r --append 追加文件到已有tar归档文件末尾
-t --list 列出已有tar归档文件的内容
-u --update 将比tar归档文件中已有的同名文件新的文件追加到tar归档文件中
-x --extract 从已有tar归档文件中提取文件

tar命令的选项options

选项options 描述
-C dir 切换到指定目录
-f file 输出结果到文件或设备file
-j 将输出重定向给bzip2命令来压缩内容
-p 保留所有文件权限
-v 在处理文件时显示文件
-z 将输出重定向给gzip命令来压缩内容

​ 注意:下载了开源软件之后,经常文件名是以 .tgz 结尾的,这些是gzip压缩过的tar文件,可以用命令 tar -zxvf filename.tgz 来解压。

参考文献:Linux命令行与shell脚本编程大全(第三版) Richard Blum , Christine Bresnahan