Shell 介绍 {#shell-介绍}
Shell
是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户。这种对话方式可以是交互的方式(从键盘输入命令,可以立即得到Shell
的回应),或非交互(脚本)的方式。换句话说,Shell
是一个命令行解释器,它为用户提供一个像 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用Shell
来启动,挂起,停止甚至是编写一些程序。
- 用于运行系统指令的程序
- shell 中运行的多条系统指令可形成 shell 脚本
- Bourne Shell(贝尔实验室发明)是最早的 shell
- Bourne-again:Bash(Ubuntu 默认采用)是在 Bourne Shell 基础上增强功能
- 通常成为终端
命令提示符 {#命令提示符}
name@host:path$
name@host:path#
其中
- name:登录用户名
- @:普通连接符
- host:主机名
- path:当前工作路径(~代表当前用户主目录)
如果是普通用户以$
结尾,反之若是 root 用户以#
结尾。
输入输出 {#输入输出}
- 进程通过输入输出流读写数据
- 默认标准输入输出称为
stdin
/stdout
。输入和输出方式都可以为:文件、设备、终端、另一个进程的 I/O - 标准错误输出流
stderr
。它是运行出错时的提示。 Ctrl-D
结束当前输入。Ctrl-C
无论当前情况如何,强制结束运行。
基本命令 {#基本命令}
cat {#cat}
cat
用来查看文件内容。
查看单个文件:
查看多个文件(合并显示):
ls {#ls}
ls
用来列出当前目录内容。
参数:
- -l : 显示详细内容(权限、inode、属主、属组、大小、修改时间 mtime)。
- -a : 包括隐藏的所有内容。
- -d : 只显示目录自身信息。
- -i : 显示 inode 信息。
- -S : 按文件大小排序(默认按字母的顺序排序)。
- -r : 倒序排列。
- -t : 按修改时间排序。
- -h : 文件大小以人类便于阅读的方式显示。
- --sort=key : 排序。
- size : 按大小。
- time : 按时间。
- extension : 按扩展名。
其中:ll
为ls -la
简写形式。
cp {#cp}
cp
用来拷贝。
参数:
- -R / r : 拷贝目录及其中全部内容。拷贝文件夹时需要用此参数。
- -l : 硬链接拷贝(复制 inode,inode 相同)。即使源文件被删除也可以正常访问。
- -s : 软链接拷贝(类似 windows 的快捷方式)。如果源文件被删除则无法再访问。
- -S : 目标名称添加后缀。
- -u : 源比目标新时才拷贝。
# 拷贝 file1 到当前路径下并重命名为 file2。
cp file1 file2
# 拷贝 file1 到当前路径的 dir 目录下。
cp file dir/
# 拷贝 file1 和 file2 到当前路径的 dir 目录下。
cp file1 file2 dir/
# 拷贝 file1 到当前路径的 dir 目录下,并重命名为 file2。
cp file1 dir/file2
# 拷贝 dir1 目录到当前路径下,并重命名为 dir2。
cp -r dir1 dir2
# 硬链接复制 file1 为 file2。
cp -l file1 file2
# 软链接复制 file1 为 file2(快捷方式)。
cp -s file1 file2
# 复制 file1 为 file2 且加后缀_suffix-name。最终得到的文件名为 file2_suffix-name。
cp -S _suffix-name file1 file2
mv {#mv}
mv
用来移动。
参数:
- -f : 强制移动、覆盖目标。
touch {#touch}
touch
用来创建空文件。若文件存在,修改文件 mtime,但不修改内容。
# 创建 test.txt 文件。
touch test.txt
rm {#rm}
rm
用来删除。
参数:
- -i : 每次删除前提醒。
- -d : 删除空目录。
# 删除单个文件。
rm filename
# 递归删除,删除目录和目录下的所有文件和目录。
rm -rf dir
echo {#echo}
echo
用来将命令的参数显示在 stdout(标准输出)。
参数:
-
-n : 显示完成后不换行。
-
-e : 解析
\
转义符。
cd {#cd}
cd
用来切换目录。
# 后面什么不要加,回到当前用户主目录。
cd
# 切换到指定目录下。
cd dirname
pwd {#pwd}
pwd
用来显示当前工作完整路径。适和用于提示符不显示完整路径的情形。
参数:
- -P : 物理路径(显示软链接对应的真实路径)。
- -L : 逻辑路径(显示软链接自身路径)。
mkdir {#mkdir}
mkdir
用来创建目录。
参数:
- -p : 一次性创建多层目录。
# 在当前路径下创建 dirname 目录
mkdir dirname
rmdir {#rmdir}
rmdir
用来删除空目录。
参数:
- -p : 删除多层空目录。
通配符 {#通配符}
*
: 表示任意多个字符。?
: 表示任意一个字符。
grep {#grep}
grep
用来查找符合条件的字符串或正则表达式。
参数:
- -i : 忽略大小写。
- -v : 反向匹配。
- -n : 显示行号。
- -r : 递归目录及子目录中的所有文件。
- -c : 显示目标文件中包含关键字的行数。
# 查看 passwd 文件中所有包含 root 的行。
grep root /etc/passwd
# 查看 passwd 文件中所有包含 r 的行。
grep r* /etc/passwd
# 显示 etc 下所有文件中包含 root 的行。
grep root /etc/*
# 多个规则同时匹配,1.txt 为包含一个或多个规则的文件。
grep -f 1.txt a.txt
# 在 a.txt 中同时搜索 a1 和 a2 和 a3。
- grep a[123] a.txt
# 在 a.txt 中搜索 1 或 2 或 3。
- grep -E '1|2|3' a.txt
less {#less}
less
用来显示文本文件的内容。是
more
命令的增强版。
# 显示 words 文件中的内容。
less /usr/share/dict/words
快捷键:
- z / b : 向下 / 上翻一页。
- v : 进入编辑模式。
- g / G : 直接跳至第一行 / 最后一行(或第n行)。
- / word : 向前搜索关键词。
- ?word : 向后搜索关键词。
- n/N : 正向/反向继续搜索关键词(输入关键词后再使用)。
- q : 退出。
# 通过管道命令和其他命令结合使用。
grep root /usr/share/dict/words | less
nano {#nano}
nano
超简单的文本编辑器。
快捷键:
- Ctrl + G : 取得在线帮助(help)。
- Ctrl + X : 离开nano软件,若有修改过文件会提示是否需要保存。
- Ctrl + O : 保存文件,如果有权限的话就能够保存文件。
- Ctrl + R : 从其他文件读入数据,可以将某个文件的内容贴在本文件上。
- Ctrl + W : 查询字符串,这个也是很有帮助的命令。
- Ctrl + C : 说明目前光标所在处的行数与列数的信息。
- Ctrl + _ : 可以直接输入行号,让光标快速移动到该行。
- Alt + Y : 校正语法功能开启或关闭(单击开,再单击关)。
- Alt + M : 可以支持鼠标来移动光标的功能。
head / tail {#head--tail}
head
/tail
--- 显示文件头部 / 尾部内容。默认显示 10 行。
参数:
- -n : n 替换为一个数字,用来指定显示多少行。
- -f : 实时显示。
tailf xxx
和tail -f xxx
作用相同。
# 查看 passwd 文件的前三行。
head -3 /etc/passwd
# 实时查看 dmesg 文件的最后 10 行。
tail -f /var/log/dmesg
diff {#diff}
diff
用来比较文本文件。
参数:
-
-u : 统一格式输出。
- --- : 表示文件 1。
- +++ : 表示文件 2。
-
-y : 并排输出比较。
- | : 表示不同。
- < : 文件 1 比文件 2 多。
- > : 文件 2 比文件 1 多。
-
-W : 在使用 -y 参数时,指定每一行占多少个字符。
-
-w : 忽略空格。
-
-i : 忽略大小写。
# 比较 file1 和 file2 两个文件。
# 返回 a : 那一行 file2 比 file1 多;
# 返回 c : 那一行 file1 和 file2 内容不同;
# 返回 d : 那一行 file2 比 file1 少;
# 无返回结果表示两个文件内容相同。
diff file1 file2
# 比较 dir1 和 dir2 两个目录构,显示不同的文件名和目录。
# 如果两个目录下有同名文件,就会比对这两个文件的内容。
diff dir1 dir2
file {#file}
file
用来检测文件格式。
顺序执行以下三种测试集。一种测试匹配成功即停止检测,全都不匹配返回 data。
- filesystem : 匹配系统头文件 <sys/stat.h>。
- magic : 匹配文件头部魔术值。使用 -l 参数查看所有魔法值。
- language : 匹配文件起始的字符类型,ASCII,UTF-8。
参数:
- -f : 文件列表文件。
- -b : 只显示摘要信息。
- -ib : 显示 mime 类型。
- -l : 查看所有魔法值。
find / locate {#find--locate}
find
/locate
用来查找文件。
locate 基于文件索引进行搜索。
每隔一段时间,linux 系统就会自动扫描系统中的文件,然后存储到数据库中,locate
就是在此数据库中查询数据。locate
不验证文件是否存在,速度快但结果不一定准确。可使用updatedb
手动更新索引。
ubuntu 新版本可能不默认安装此命令,使用:
# 安装
sudo apt update -y
sudo apt install mlocate -y
# 更新索引
sudo updatedb
find 从硬盘查找文件
参数:
- -name : 后面接查找的名字。
- -type : 按文件类型查找,以后可指定以下参数。
- b : 块设备文件。
- d : 目录。
- c : 字符设备文件。
- p : 管道文件。
- l : 符号链接文件。
- f : 普通文件。
- -user : 根据所属用户查找,后面接用户名。
- 按时间查找,n 是一个数字,可以使用加减号,如:n / -n,+n。
- -amin n : 查找系统中最后 n 分钟访问的文件(从当前时间向前推 n 分钟,下同)。
- -atime n : 查找系统中最后 n*24 小时访问的文件(从当前时间向前推 n*24 小时,下同)。
- -cmin n : 查找系统中最后 n 分钟被改变文件状态的文件。
- -ctime n : 查找系统中最后 n*24 小时被改变文件状态的文件。
- -mmin n : 查找系统中最后 n 分钟被改变文件数据的文件。
- -mtime n : 查找系统中最后 n*24 小时被改变文件数据的文件。
- -cnewer : 后面接文件名,表示搜索比这个指定的文件要更新的文件。
# 从 / 开始查找名称为 test.txt 的文件
find / -name test.txt
# 从 / 开始查找那些修改时间在当前时间的前 20 天内,且在当前时间的前 1 天之前的所有文件。
find / -mtime +1 -mtime -20
stat {#stat}
stat
用来显示文件/文件夹详细信息包括 MAC 时间。
- Modify : 文件的修改时间。
- Access : 最后访问时间。
- Change : 文件属性修改时间。
sort {#sort}
sort
用来排序。
参数:
- -r : 反向排序。
- -n : 按数值大小排序。
- -M : 将前面 3 个字母依照月份的缩写进行排序。
# 对 a.txt 文件的内容进行排序。
sort a.txt
vi {#vi}
vi
用来文本编辑。
Linux 所有对象都是文件,运行中的文件称为进程。
所有服务器配置都是通过编辑文本配置文件来完成。vi、nano、emacs(无优劣之分)。
vi
的三种模式:
- 一般命令模式(默认):
- 从编辑模式按 ESC 或 Ctrl + [ 进入。
- Ctrl + f : 向文件尾翻一屏。
- Ctrl + b : 向文件首翻一屏。
- ZZ : 保存当前修改并退出。
- D : 删除光标到行尾内容。
- dd : 删除光标所在行全部内容。
- ndd : 从光标所在行向后删除n行(包括当前行)。
- yy : 复制光标所在行全部内容。
- nyy : 从光标所在行向下复制n行内容。
- p : 粘贴。
- /关键字 : 向前搜索关键字,按 n 跳入下一个符合的位置。
- ?关键字 : 向后搜索关键字,按 n 跳入下一个符合的位置。
- 命令模式:
- 从一般命令模式按 :(英文冒号)进入。按 ESC 回到一般命令模式。
- :a, bs/A/B : 从 a 行到 b 行搜索字符 A 并替换成 B。例如:
:1,$s/word1/word2/gc
表示全文范围内替换,其中 $ 代表尾行,g 代表全局范围,c 代表替换前确认一下。 - :5 : 光标跳至第5行首。
- :$ : 光标跳至末尾行首。
- :w : 保存退出。
- :q! : 不保存退出。
- :e b.txt : 编译b.txt(可以自动补齐,多文件编辑模式)。
- :n : 编辑下一个文件。
- :f : 显示当前编辑的文件名和编辑信息。
- :set number : 显示行号。
- :set nonumber : 不显示行号 。
- 编辑模式:
- 从一般命令模式按 i、a、o 进入。
- a : 在当前光标后添加文本。
- A : 在行末添加文本。
- i : 在当前光标前插入文本。
- I : 在行首插入文本。
- o : 在光标当前行的下一行插入一空行。
- O : 在光标当前行的上一行插入一空行。
man / info {#man--info}
man
/info
用来查看帮助文档。
Linux 系统有完善的文档体系,Manual 是最主要的帮助。
GUN 项目不太喜欢man
,因此开发了info
。有时候优于man
,有时不是。
# 查看 ls 命令使用手册。
man ls
info ls
# 搜索关键词(不知道具体命令)。
man -k keyword
# 查看指定的章节号。
man 5 passwd
其中man 手册
章节号含义如下:
- 1 : 用户命令
- 2 : 系统调用
- 3 : 高级Unix编程库文档(程序员常用)
- 4 : 设备接口和驱动信息(很少使用)
- 5 : 文件描述(系统配置文件)
- 6 : Games
- 7 : 文件格式,惯例,编码(ASCII等)
- 8 : 系统命令和服务器
其它一些地方的帮助文档
- /usr/share/doc : 其他 一些帮助文档
- command -h / --help : 显示命令自身提供的帮助信息
awk {#awk}
awk
用来格式化文本信息。
# 显示一行内的第二列内容,默认以空格分割。
awk '{print $2}'
# 显示一行内的第二列内容,并指定 :为分割符。
awk -F: '{print $2}'
sudo {#sudo}
sudo
用来临时切换成 root 账户执行命令。sudoer 出于安全的考虑 sudo。
# 编辑sudo配置文件(/etc/sudoers)。
visudo
进程管理 {#进程管理}
进程就是运行中的程序文件
进程的一些基本信息:
- PID : 进程ID
- TTY : 运行进程的终端设备
- STAT : 进程状态(S leep、Running)
- TIME : 该进程占用的 CPU 时间
- COMMAND : 命令名称
查看进程 {#查看进程}
ps
命令,参数如下:
- -x : 当前用户启动的所有进程。
- -ax : 所有用户启动的进程。
- -u : 进程详细信息。
- -w : 显示进程文件完整路径。
# 查看追定进程。可以使用 $$ 表示当前 shell 进程的 pid。
ps u pid
# 查看进程下的线程。
ps - L pid
# 树型显示进程,包含 pid。
ps fjax
pstree
命令,树型显示进程。
结束进程 {#结束进程}
kill
命令,基本使用方法如下:
# 结束 pid 进程,默认是发送 TERM 指令。
kill pid
# 暂停进程。
kill -STOP pid
# 恢复已暂停的进程。
kill -CONT pid
# 暴力结束进程。
kill - KILL pid
kill -9 pid
# 显示所有 kill 命令的指令。
kill -l
打包压缩 {#打包压缩}
gzip {#gzip}
gzip
是 Linux 标准压缩程序,GUN Zip。
gzip
不能做多文件或目录的归档打包。
# 压缩,会删除原始文件。
gzip file
# 解压。
gunzip file
tar {#tar}
tar
用来打包归档(Archive)。
参数:
- c : 创建归档。
- v : 详细诊断输出。
- f : 此参数后面必须是归档文件名。
- x : 解包。
- t : 显示包里面的东西,不会解出来。
# 查看包内容。
tar tvf arch.tar
# 解包。
tar xvf file.tar
# 解包并保留原始权限。
tar xvf file.tar -p
# 降低磁盘和内核IO消耗(打包同时压缩)。
zcat file.tar.gz | tar xvf -
# z : 表示自动调用 gzip。另外 .tgz == .tar.gz。
tar ztvf file.tar.gz
# 解压压缩的文件。
gunzip file.tar.gz
另外:zcat == gunzip -dc
- -d : 解压
- -c : 解压结果输出到 stdout
bzip2 {#bzip2}
bzip2(bz2)
另一个压缩程序。比 gzip 压缩速度慢,文本压缩比高(发布源码时用)。
bunzip2
解压。
# j : 表示自动调用 bzip2。
tar jcvf file.tar.bz2 file1 file2 ......
命令行快捷键 {#命令行快捷键}
- Ctrl + b : 光标向左。
- Ctrl + f : 光标向右。
- Ctrl + p : 光标向上。
- Ctrl + n : 光标向下。
- Ctrl + a : 光标移至行首。
- Ctrl + e : 光标移至行尾。
- Ctrl + w : 删除光标前面以空格分割的段落(内容)。
- Ctrl + u : 删除光标当前位置到行首。
- Ctrl + k : 删除光标当前位置到行尾。
- Ctrl + y : 粘贴删除的内容。
Shell 输入与输出 {#shell-输入与输出}
可分为标准输入、标准输出、标准错误输出。
输出重定向 {#输出重定向}
# 覆盖 a.txt 原来的内容。
command > a.txt
# 向 a.txt 追加内容。
command >> a.txt
可以使用set -C
命令设置禁止覆盖文件,防止误操作。
标准输入重定向 {#标准输入重定向}
# 将 a.txt 中的内容传递给 command 命令。
command < a.txt
如:head < /proc/cpuinfo
== head /proc/cpuinfo
管道 {#管道}
管道|
将前一个命令的输出作为后一个命令的输入。
# 显示计算机 CPU 信息的前 10 行,并将其中的小写字母转换为大写字母。
head /proc/cpuinfo | tr a-z A-Z
# 从 ifconfig 命令的输出中提取计算机网络接口的 IPv4 地址。
ifconfig | grep inet | awk '{print $2}' | awk -F: '{print $2}'
标准错误 {#标准错误}
stderr
表示标准错误(错包含重要信息)。
# 2 : 表是标准错误的标号。此命令表示将出错信息重定向到 e 文件,而不显示到屏幕。
ls /abcdefg 2 > e
# 标准输出到 f 文件,标准错误输出重定向到标准输出,所以最后标准输出和标准错误都会输出到 f 文件。
ls /asd > f 2>&1
常见报错信息 {#常见报错信息}
- No such file or directory : 查看不存在的文件目录。
- File exists : 创建与文件同名的目录。
- Not a directory, Is a directory : 把文件当目录。
- No space left on device : 磁盘空间不足。
- Permission denied : 权限不足。
- Operation not permitted : 杀掉不属于自己的进程。
- Segmentation fault, Bus error : 程序访问禁用内存。
FHS {#fhs}
Filesystem Hierarchy Standard(文件系统层次化标准)的缩写,多数 Linux 版本采用这种文件组织形式,类似于 Windows 操作系统中 c 盘的文件目录,FHS 采用树形结构组织文件。FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录,同时还给出了例外处理与矛盾处理。
- 相对路径 / 绝对路径。
.
: 表示当前目录。..
: 表示当前目录的上层目录。
| 目录 | 作用 | |:--------|:-----------------------------------------------------------------------------------------| | / | 根目录,一台电脑有且只有一个根目录,所有的文件都是从这里开始的。 | | /bin/ | 基础的,用户级别指令存放位置, 二进制可执行命令文件。 | | /boot/ | 存储操作系统启动、引导过程中的静态文件。 | | /dev/ | 这里主要存放与设备(包括外设)有关的文件, 系统就是从这个目录开始工作的。另外还有一些包括磁盘驱动、USB 驱动等都放在这个目录。 | | /etc/ | 主要存放系统配置方面的文件。 | | /home/ | 这里主要存放你的个人数据。具体每个用户的设置文件,用户的桌面文件夹,还有用户的数据都放在这里。每个用户都有自己的用户目录,位置为:/home/用户名。当然,root 用户除外。 | | /lib/ | 基本的,共享的库文件,以及内核模块。 | | /media/ | 挂载外部存储,一般挂载移动存储类型的设备,例如 u 盘,光驱等。 | | /mnt/ | 挂载外部存储,一般把临时的挂载,挂载到 mnt。 | | /opt/ | 安装除操作系统软件之外的其他软件的时候,默认的安装目录。 | | /sbin/ | 系统级别的可执行程序。 | | /srv/ | 存放服务的数据。 | | /tmp/ | 存放临时文件。 | | /usr/ | 放置用户级别的工具和软件,子目录还有bin、sbin等也是存放用户和系统级别的可执行程序(历史遗留问题)。 | | /var/ | 存放经常变动的系统文件,例如系统日志文件,用户邮件等。 | | /root/ | root 用户的主目录。 | | /proc/ | 系统启动过程中临时生成,关机后就没有了,是一个虚拟目录, 它是内存的映射,包括系统信息和进程信息。 |