读书计划开始了,这是我要阅读的第二本书,命令行操作还是很重要的
2 什么是 Shell
root@ikutarian:~# 是什么
进入 bash,可以看到已经有一行文字显示在上面了
1 | root@ikutarian:~# |
root表示当前登陆的用户,我现在是以 root 用户登陆,所以显示的是rootikutarian是我这台电脑的名称~表示当前所在的路径,目前是在 root 用户的 home 目录下#表示当前是超级管理员角色。如果是普通用户,显示的是$
命令历史记录
可以通过键盘 ↑与键盘 ↓ 查看命令历史记录
几个常用的命令:
退出终端
1 | exit |
关机
1 | shutdown now |
查看当前日期
1 | date |
查看本月日历
1 | cal |
查看硬盘使用量
1 | df -h |
查看内存使用量
1 | free -h |
3 文件系统
文件系统的属性结构
Windows 是每个存储设备都有一个自己的文件系统,比如 C 盘、D 盘等。但是 Linux 不一样。不管有多少个存储设备,都是只有一个文件系统。这些存储设备是挂载到目录树上的
目录树只有一个根节点 /,然后下面文件和子目录,子目录里面又有文件和子目录
查看当前的工作目录
1 | pwd |
pwd 就是 print working directory 的缩写
home 目录
每个用户都有自己的 home 目录,比如 root 用户的 home 目录是 /root。一个叫 ikutarian 的用户的 home 目录是 /home/ikutarian
可以用 ~ 表示自己的 home 目录,输入 cd ~ 即可跳转到自己的 home 目录
列出目录内容
1 | ls |
目录跳转
1 | cd |
有两种方式可以跳转:
- 绝对路径 -
/path - 相对路径 -
.表示当前目录,..表示上一级目录
文件名的规范
- 以
.开头的是隐藏文件 - 文件名大小写敏感
- Linux 没有文件扩展名的概念
- 文件名不要带空格,可以用
_代替
4 探究操作系统
ls -l
ls -l 可以列出目录下的文件和目录信息,比如
1 | root@ikutarian:/etc# ls -l |
这些字段都有自己的含义,以第一行 drwxr-xr-x 3 root root 4096 Nov 6 10:26 acpi 为例从左到右进行说明
drwxr-xr-x 是由 3 个部分组成的: d + rwx + r-x + r-x。d 表示这是一个目录,如果是文件就以 - 表示。后三个字符(rwx)是文件所有者的访问权限。再后面三个字符(r-x)是文件所属用户组的访问权限,最后三个字符(r-x)是所有人的访问权限。
rwx 中 r 是 read,表示可读;w 是 write,表示可写;x excute,表示可执行
3 表示硬链接的数目
root 表示文件所属用户
root 表示文件所属用户组
4096 表示文件的大小,以字节为单位
Nov 6 10:26 是文件最后修改日期
acpi 是目录名,如果是文件就是文件名
查看文件类型
Linux 不要求文件名要有后缀。如果先知道文件的类型,可以使用
1 | file filename |
来查看文件类型
5 操作文件和目录
通配符
可以用通配符来表示一些特定格式的文件名和目录名,所以通配符的知识也需要掌握
| 通配符 | 意义 |
|---|---|
| * | 匹配任意多个字符(>= 0) |
| ? | 匹配任意一个字符(== 0) |
| [characters] | 匹配任意一个属于字符集中的字符 |
| [!characters] | 匹配任意一个不在字符集中的字符 |
| [[:class:]] | 匹配任意一个指定字符类中的字符 |
假设我要查找文件,用通配符来指代文件名
| 模式 | 匹配对象 |
|---|---|
| * | 所有文件 |
| g* | 所有以字母“g”开头的文件 |
| b*.txt | 以“b”开头,中间又零个或多个字符,以“.txt”结尾的文件名 |
| Data??? | “Data”开头,后面跟着三个字符的文件名 |
| [abc]* | 以“a”或“b”或“c”开头的文件名 |
一个新知识:字符类
| 字符类 | 意义 |
|---|---|
| [:alnum:] | 匹配任意一个字母或数字 |
| [:alpha:] | 匹配任意一个字母 |
| [:digit:] | 匹配任意一个数字 |
| [:lower:] | 匹配任意一个小写字母 |
| [:upper:] | 匹配任意一个大写字母 |
对于 [a-z] 和 [A-Z],不要再使用它了,应该改用 [:lower:] 和 [:upper:]
创建目录
1 | mkdir directory ... |
复制文件和目录到指定的目录
复制一个文件或目录到指定的目录
1 | cp item target_dir |
复制多个文件或目录到指定目录
1 | cp item ... target_dir |
移动和重命名
1 | mv item1 item2 |
删除
1 | rm item |
强制删除
1 | rm -f item |
删除目录
1 | rm -r item |
重要
删除文件之前,先执行
ls命令确认要删除的内容
符号链接和硬链接
硬链接没什么用,学习符号连接才对。符号连接也叫软链接
1 | ln -s item link |
-s 就是表示软连接的 soft 的缩写
关于硬链接和符号链接,可以看这篇《理解Linux的硬链接和软链接》
6 使用命令
命令有哪些类型?
可以使用 type 命令查看命令的类型
- 可执行程序
比如位于 r/bin/ 和 /usr/bin/ 下的文件,比如 cp、python、gcc 等
使用 type 命令输出
1 | root@iZ94fg0bhwgrgtZ:~# type python |
可以看到 python is /usr/bin/python
- 内置的 shell 命令
比如 cd
1 | root@iZ94fg0bhwgrgtZ:~# type cd |
type 自己本身也是内置的 shell 命令
1 | root@iZ94fg0bhwgrgtZ:~# type type |
- 一个 shell 函数
一个加入到环境变量的 shell 脚本
- 一个命令别名
ls 其实是一个命令别名
1 | root@iZ94fg0bhwgrgtZ:~# type ls |
which -显示可执行程序的路径
1 | root@iZ94fg0bhwgrgtZ:~# which ls |
查看命令的文档
whatis - 一句话解释命令的用途man - 查看手册
有些命令还可以带上 --help 参数查看文档
命令的分隔符
使用 ; 作为命令的分隔符
查看所有已经定义的别名
不要带参数
1 | alias |
给命令设置别名
两个步骤:
- 查找别名是否已经被使用
- 创建别名
给 cd /usr; ls; cd 创建一个别名,比如 test。首先确认一下 test 是否被使用
1 | root@iZ94fg0bhwgrgtZ:~# type test |
可以看到 test 是一个内置的 shell 命令。于是换一个名字,比如 foo
1 | root@iZ94fg0bhwgrgtZ:~# type foo |
-bash: type: foo: not found 表示 foo 没有被使用。那就用这个了
alias 的格式如下,name='string' 没有空格
1 | alias name='string' |
于是
1 | alias foo='cd /usr; ls; cd' |
注意:
如果输入 exit 退出账户的话,刚刚创建的别名就失效了。可以加到环境变量中,让别名不失效
7 重定向
标准输入、标准输出、标准错误
- stdin
- stdout
- stderr
stdout 和 stderr 通常连接的是屏幕,stdin 连接的是键盘
所谓重定向
就是改变 stdin 的来源,改变 stdout、stderr 的输出位置
重定向 stdout 到文件
使用 >
> 会覆盖或者新建文件内容。如果要向文件追加内容,可以使用 >>
重定向 stderr 到文件
使用 2>。比如,对一个不存在的目录使用 ls
1 | ls foo 2> ls-out.txt |
重定向 stdout、stderr 到同一个文件
使用 &>
列出不存在的目录 foo 和 ~ 目录的内容,并重定向到文件中
1 | ls foo ~ &> ls-out.txt |
重定向 stdin
使用 <,把输入源从键盘改成文件
1 | cat < ls-out.txt |
管道
|,前一个命令的输出作为下一个命令的输入
打印匹配文本
grep,可以打印匹配文本所在那一行的所有文本,可以使用正则表达式
把数据同时输出到 stdout 和文件
这条命令无法得到结果。因为 | 和 > 没办法同时用
1 | ls -l ~ | > ls-out.txt |
和管道连用时,可以用 tee 代替 >
1 | ls -l ~ | tee ls-out.txt |
9 键盘操作高级技巧
清空屏幕
1 | clear |
自动补全
键盘 Tab 键
命令历史记录
1 | history |
搜索历史记录,比如
1 | history | grep /usr/bin |
10 权限
这是重点
拥有者、组成员、其他人
这个文件或者文件夹是我的,我就是拥有者(Owener),我对它拥有控制权
而我又是属于一个用户组,我可以规定我的组员们对这个文件或者文件夹拥有怎么样的控制权
而对于组员之外的其他用户,我可以规定他们对这文件或者文件夹拥有怎么样的控制权
权限
- 读(read)
- 写(write)
- 执行(excute)
权限的表示法
- 八进制
- 符号
常用的就用“八进制”即可
| 八进制 | 二进制 | 权限 |
|---|---|---|
| 0 | 000 | — |
| 1 | 001 | –x |
| 2 | 010 | -w- |
| 3 | 011 | -wx |
| 4 | 100 | r– |
| 5 | 101 | r-x |
| 6 | 110 | rw- |
| 7 | 111 | rwx |
chmod
权限,也叫 “File Mode”,所以 chmod 就是 “change file mode” 的缩写
1 | root@iZ94fg0bhwgrgtZ:~# > foo.txt |
11 进程
PID
系统会给每个进程分配一个数字,这个数字叫 PID(process id 的缩写)
查看进程快照
显示当前会话相关的进程快照
1 | ps |
以一定格式,输出所有进程快照的信息
1 | ps aux |
查看系统的动态信息
1 | top |
比如
1 | top - 20:51:07 up 41 days, 6:59, 1 user, load average: 0.06, 0.05, 0.02 |
下面逐行说明
1 | top - 20:51:07 up 41 days, 6:59, 1 user, load average: 0.06, 0.05, 0.02 |
| 字段 | 意义 |
|---|---|
| top | 程序名 |
| 20:51:07 | 当前时间 |
| up 41 days, 6:59 | 计算机从上次启动到现在的正常运行时间 |
| 1 user | 有一个用户登陆系统 |
| load average | 加载平均值。分别表示最后60秒、前5分钟、前15分钟。若平均值低于1.0,表示计算机工作不忙碌 |
1 | Tasks: 90 total, 1 running, 89 sleeping, 0 stopped, 0 zombie |
| 字段 | 意义 |
|---|---|
| Tasks | 总结了进程数目和各种状态下进程的个数 |
1 | %Cpu(s): 0.3 us, 1.0 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st |
| 字段 | 意义 |
|---|---|
| %Cpu(s) | CPU正在执行的进程的特性 |
| us | user process(用户进程) |
| sy | system process(内核进程) |
| ni | nice process,即低优先级进程 |
| id | 表示 98.7% 的 CPU 时间是空闲的 |
| wa | 0.0% 的 CPU 时间来等待 IO |
1 | KiB Mem : 2048124 total, 110620 free, 96232 used, 1841272 buff/cache |
物理内存的使用情况
1 | KiB Swap: 0 total, 0 free, 0 used. 1742532 avail Mem |
交换分区(虚拟内存)的使用情况
给进程发送信号
1 | kill [-signal] PID... |
[-signal] 常用的是 9,表示让内核立刻杀死进程(进程来不及做收尾工作或者保存劳动成果)。比如 kill -9 PID...
12 环境变量
两个重要的配置文件
/etc/profile˜/.bashrc
/etc/profile 是全局配置文件。˜/.bashrc 是用户自己的配置文件
以 Windows 为例
/etc/profile 就相当于系统变量,˜/.bashrc 就相当于用户变量
注意
修改完配置文件之后,需要使用 source 命令才能生效
PATH
就相当于 Windows 环境变量里的 Path
可以用 $PATH 表示
1 | echo $PATH |
以安装 JDK 为例
下载 jdk-8u191-linux-x64.tar.gz 到 /root/,然后解压到 /root/jdk1.8.0_191/ 文件夹中。打开 etc/profile,在最后面增加以下语句
1 | JAVA_HOME=/root/jdk1.8.0_191 |
让环境变量生效
1 | source /etc/profile |
现在测试一下 echo $PATH,可以看到末尾多出了 JDK 的路径
1 | root@iZ94fg0bhwgrgtZ:~/jdk1.8.0_191# echo $PATH |
再测试一下 java -version,可以打出 JDK 的版本
1 | root@iZ94fg0bhwgrgtZ:~/jdk1.8.0_191# java -version |
13 vi 编辑器
模式
- 命令模式 - 键盘
ESE - 插入模式 - 键盘
i
保存
- :w
- :wq
移动光标
- 上 - 键盘
j - 下 - 键盘
k - 左 - 键盘
h - 右 - 键盘
l - 行首 - 键盘
0 - 行尾 - 键盘
$ - 文件末尾 - 键盘
G
追加文字
- a - 当前位置的下一个位置进行追加
- A - 当前行的行尾进行追加
行插入
- o - 当前行的下方插入
- O - 当前行的上方插入
删除
- x - 删除当前字符
- dd - 删除当前行
复制粘贴
- yy - 复制当前行
- p - 粘贴当前行
查找
- / + 要查找的字符
- n - 下一个结果
15 软件包管理
更新软件源
Debian
1 | apt-get update |
RedHat
1 | yum update |
查找软件包
Debian
1 | apt-cache search search_string |
RedHat
1 | yum search search_string |
安装软件包
Debian
1 | apt-get install package_name |
RedHat
1 | yum install package_name |
卸载软件包
Debian
1 | apt-get remove package_name |
RedHat
1 | yum erase package_name |
19 归档和备份
压缩
1 | gzip file_name |
会生成一个 file_name.gz 文件名的文件,同时 file_name 文件消失了
解压缩
1 | gzip -d file_name.gz |
可以得到 file_name 文件名的文件,同时 file_name.gz 文件消失了
解压归档文件
比如 file_name.tar.gz 就是一个用 gzip 压缩过的 tar 归档文件,所以解压的时候,要使用
1 | tar zxf file_name.tar.gz |
z 表示这是一个用 gzip 压缩过的 tar 归档文件。x 表示把文件从 tar 包中提取出来。f 表示目标文件名,也就是 file_name.tar.gz
25 编写第一个 Shell 脚本
模板
文件名:hell_world.sh
1 | #!/bin/bash |
权限
自己有 rwx 权限,其他人有 r-x 权限
1 | chomod 755 hell_world.sh |
注意:
为了能够执行脚本,脚本必须是可读的。所以 r-x 权限必不可少
运行
1 | ./hell_world.sh |
或者也可以加入环境变量
命令总结
- 常用命令
exit- 退出终端shutdown now- 关机date- 查看当前日期cal- 查看本月日历df -h- 查看硬盘使用量free -h- 查看内存使用量
- 文件系统
pwd- 查看当前的工作目录ls- 列出目录内容cd- 文件夹跳转file- 查看文件类型mkdir- 创建目录cp- 复制文件或目录mv- 移动和重命名rm- 删除文件或目录ln- 创建链接
- 使用命令
type- 命令查看命令的类型which-显示可执行程序的路径whatis- 一句话解释命令的用途man- 查看手册alias- 查看所有已经定义的别名alias name='string'- 创建命令的别名
- 重定向
>- 重定向 stdout 到文件2>- 重定向 stderr 到文件&>- 重定向 stdout、stderr 到同一个文件<- 重定向 stdin|- 管道grep- 打印匹配文本所在那一行的所有文本tee- 把数据同时输出到 stdout 和文件
- 键盘操作高级技巧
clear- 清空屏幕- 键盘 Tab 键 - 自动补全
history- 命令历史记录
- 权限
chmod- 更改权限sudo- 获取超级用户权限
- 进程
ps- 查看进程快照top- 查看系统的动态信息kill- 给进程发送信号
- 环境变量
/etc/profile- 全局配置文件~/.bashrc- 用户自己的配置文件source- 让配置文件生效
- 软件包管理
apt-get update- 更新软件源apt-cache search search_string- 查找软件包apt-get install package_name- 安装软件包apt-get remove package_name- 卸载软件包
- 归档和备份
gzip file_name- 压缩gzip -d file_name- 解压缩tar zxf file_name.tar.gz- 加压缩归档文件