Linux哲学
- Linux基本原则
- 由目的单一的小程序组成,组合小程序完整复杂任务
- 一切皆文件
- 避免捕获用户接口,避免与用户交互
- 配置文件保存为纯文本格式
- 命令格式
命令 选项 参数
- 短选项:
-
加某个字母,如-h
查看help- 短选项可以多个选项写一起
-a -b = -ab
- 短选项可以多个选项写一起
- 长选项:
--<option>
- 短选项:
- 命令模板
[]
中表示可选的内容<>
中表示必须给出的内容...
表示可以出现多个,可以使用多次- 用
|
分割表示多选一,如[-a|-b]
- 魔数Magic Number:标记文件的执行格式,如
#!/bin/sh
,也称为shebang
FHS(文件层级系统)
- /boot: 系统启动相关文件
- /dev: 设备文件
- /etc: 配置文件,存文本
- /home: 用户家目录
- /root: 管理员家目录
- /lib: 库文件
- /lib/modules: 内核模块文件
- 静态库
- linux下表现为.a
- 动态库:载入到内存中可以复用
- win下表现为.dll文件,linux下表现为.so(shared object)
- /opt: 可选目录,第三方程序的安装目录
- /proc: 伪文件系统,内核映射
- /sys: 伪文件系统,跟硬件相关的属性映射
- /tmp: 临时文件,会定时清理
- /var: 可变化文件
- /bin: 可执行文件,用户命令
- /sbin: 管理命令
- /usr: universal shared read-only
- usr下之所以有/usr/bin和/usr/sbin是因为/bin跟启动系统相关,而/usr下跟启动系统后提供正常功能相关
- /usr/local: 又是一个独立的文件系统,也有bin,sbin。是第三方软件的安装路径
常用工具
- man:查看手册
whatis name
查看name的目录,使用man [n] name
打开name第n章
- tr:字符串转换或删除
tr 'a-z' 'A-Z'
把输入中的字符转换成大写tr -d 'abc'
删除出现的字符,这里是a,b,c
- shell中可以开子shell,使用
pstree
可以查看父子关系,使用exit退出一个 - 环境变量
PATH
命令搜索路径HISTSIZE
命令历史缓冲区- 使用
history
查看命令历史 - 使用
!n
执行命令历史中第n条历史命令 - 使用
!-n
执行命令历史中倒数第n条历史命令 - 使用
!!
执行刚才执行的命令 - 使用
!string
执行命令历史中最近的以指定字符串开头的命令 - 使用
!$
引用上一个命令的最后一个参数
- 使用
- 命令替换:
$(COMMAND)
或使用反引号`COMMAND`- 把命令的结果放入一个命令中
echo $(ls)
- shell中的引号:
- 反引号``:命令替换
- 双引号””:弱引用。可以实现变量替换
- 单引号’’:强引用。不能实现变量替换
- 文件名通配,globbing
*
:任意长度的任意字符?
:任意单个字符[]
:指定范围内的任意单个字符[^]
:指定范围外的任意单个字符- 特殊字符,形如
[:punct:]
。[:punct:]
所有的标点符号
- 生成列表
seq [OPTION] [FIRST] [INCREMENT] LAST
xargs
- 从标准输入接收命令并执行
w
- 显示已登录的用户
last
- 显示登录日志,即显示
/var/log/wtmp
文件
- 显示登录日志,即显示
lastb
- 显示错误的登录日志,即显示
/var/log/btmp
文件
- 显示错误的登录日志,即显示
lastlog
- 显示每一个用户最近一次的成功登录信息
basename
- 显示文件的基路径名
管道及IO重定向
- 系统设定
- 默认输入设备,标准输入,stdin, 0
- 默认输出设备,标准输出,stdout, 1
- 标准错误输出,stderr, 2
- 重定向及文件描述符
- 输出重定向
>
覆盖输出- 强制覆盖:当设置了不允许覆盖已存在文件时使用
>|
- 强制覆盖:当设置了不允许覆盖已存在文件时使用
>>
追加输出2>
,2>>
重定向错误输出- 可以使用
ls ./ > a.out 2> b.out
这样的形式
- 可以使用
&>
将两种输出(标准输出,标准错误)同时输出到同个文件2>&1
重定向绑定,2(标准错误)重定向到1定向的文件- shell脚本从左所以注意顺序
>/dev/null 2>&1
VS2>&1 >/dev/null
- 前者1定向到null,2再定向到1定向的文件(null)
- 前者1定向到null,2再定向到1定向的文件(stdout),然后1才定向到null
- 为什么不用
>/path/to 2>/path/to
- 这种方法,标准输出和错误输出会抢占out文件的管道,因此输出的顺序无法估计
- shell脚本从左所以注意顺序
- 输入重定向
<
输入重定向<<
Here Document1
2
3echo << END_SIGN
> hello
> END_SIGN
- 关闭/打开文件描述符(输入输出)
[n]>&-
或[n]<&-
,都是把文件描述符n关闭[n]<>file
,打开file,指定其文件描述符为n,不指定默认为0exec 1>&-
后尝试echo mess
将会失败exec closed_fd>new_fd
或exec new_fd<close_fd
,打开文件描述符
- 文件描述符复制
[fd1]>&fd2
或[fd1]<&fd2
,把fd2复制给fd1- 在不缺省的情况下两者的等价的,都是将fd2的描述符复制给fd1
- 如果fd1缺省,则
>&fd2
默认复制给标准输出;而<&fd2
默认复制给标准输入
- 文件描述符移动
[fd1]>&fd2-
,把文件描述符fd2代表的输出文件复制给fd1,并关闭fd2- 即输出重定向,然后关闭
[fd1]<&fd2-
,把文件描述符fd2代表的输入文件复制给fd1作为输入文件,并关闭fd2
- 输出重定向
- 管道
cmd1 | cmd2
前一个命令的输出作为后一个命令的输入
- tee
man tee
一个输入两个输出
Shell编程
变量
VARNAME=VALUE
- 引用:
$VAENAME
or${VARNAME}
,注意$()
是引用执行结果,而{}
才是引用内容 - 环境变量:作用域为当前shell或器子进程
- 用
export
导出,export var=value
- 用
- 位置变量
$0, $1, ...
,所有参数,第一个参数…shift [n]
,把第一个变量弹出。因此有很多变量时可以使用shift
- 特殊变量
$?
,上一个命令的执行状态返回值,0正确,1~255执行错误$#
,参数个数$*
,参数列表$@
,参数列表
- 声明
declare [OPTION] VAR=VALUE
declare -i SUM=0
,声明整形变量SUMdeclare -x A=0
,声明export变量A
条件分支
1 | if expression; then |
- 条件测试的表达式
[ expression ]
, 注意 中扩号两端的空格是必须的[[ expression ]]
,两种方法用法相同,但是两个中括号是bash的关键字test expression
- 因为if语句取的是表达式执行状态的结果,所以如果条件判断是命令则不需要中括号,如
if test expression; then
- shell中进行算数运算
- shell把所有的变量都当作字符,所以要进行算数运算需要额外操作
let
,见help let
。如let c=$a+$b
$[expression]
。如c=$[$a+$b]
$(())
。如c=$(($a+$b))
expr expression
,表达式中,各操作数和操作符直接要有空格,且要使用命令引用。因为本质是调用expr
程序。如c=$(expr $a + $b)
- 退出脚本:
exit
- 如果没有指定退出状态,则返回上一条命令的执行状态
- 0正确,1~255错误
- 文件测试
-e FILE
,是否存在-f FILE
,是否普通文件-d FILE
,是否为目录-r/w/x
,是否可读写执行
- 组合测试条件
-a
,逻辑与-o
,逻辑或!
,非- 也可以使用
[ expression ] || [ expression ]
switch case
1 | case SWITCH in |
文本处理
sed
流编辑器(Stream EDitor, sed)。行编辑器。默认将输出到屏幕
sed [option] 'AddressCommand' file...
- option
-n
静默模式,不再显示模式空间中的内容-i
修改原文件-r
使用扩展正则表达式
- Address:
- Startline,Endline
- $ 表示最后一行
- Startline,Endline
- /RegExp/
- /pattern1/,/pattern2/
- 从被1匹配到的行开始到被2匹配的行结束
- /pattern1/,/pattern2/
- Startline, +N
- 从起始行开始向后N行
- Startline, +N
- Command
d
删除- 如
sed 1,2d
- 如
p
显示符合条件行a string
在指定行后追加i string
在指定行前面加r FILE
将指定文件的内容添加都符号条件的行w FILE
将地址指定的范围的行保存到指定文件中s/pattern/string/[opt]
查找并替换g
全局替换i
忽略大小写- 分隔符号不一定是
/
也可是@, #, ~...
等 %
全文查找
- 引用匹配串
&
整个串\1
第1组
特殊权限
SUID:文件运行时,相应进程的属主是程序文件自身的属主,而非启动者
chmod u+s FILE
chmod u-s FILE
- 如果FILE本身就有执行权限,则SUID显示为s,否则为S
GUID:文件运行时,相应进程的属组是程序文件自身的属组,而非启动者所属的基本组
chmod g+s FILE
chmod g-s FILE
Sticky:在一个公共目录,每个用户都可以创建文件,删除自己的文件,但不能删除别人的文件
chmod o+t DIR
chmod o-t DIR
也可用
111
,二进制表示FACL, Filesystem Access Control List
setfacl OPTION FILE
-m
,设定u:UID:perm
g:GID:perm
-x
,取消设定
getfacl FILE
文件系统
创建设备节点
mknod
1 | 主设备号 次设备号 |
文件系统
文件系统类型众多,接口可能各异,软件开发不可能要为每种文件系统的不同接口编写代码,那就本末倒置了。所以 Linux使用VFS(虚拟文件系统)作为翻译官 以支持众多文件系统。
linux常用的文件系统有ext3、ext4、xfs…
创建文件系统:mkfs
- 格式化
- 高级格式化:创建文件系统
mkfs
- 高级格式化:创建文件系统
内存
linux使用线性虚拟内存做中介,从虚拟内存映射到物理内存。当物理内存满时,将闲置的程序内存放到交换空间。
查看内存以及交换空间free
,默认单位是字节,free -m
以兆为单位显示。
- 交换空间扩容
- 新建分区
- 创建交换分区文件系统
mkswap /path/dev
- 创建交换分区文件系统
- 启用交换空间
swapon /path/dev
,关闭交换分区swapoff /path/dev
- 启用交换空间
dd命令
man dd
conver and copy a file,转换并复制文件。取别于cp,cp是以文件为单位复制,而dd复制的是底层是数据流。cp复制文件需要将文件从文件系统读取到内存,然后再从内存复制到文件系统的其他位置。而dd复制相当于直接复制文件的二进制代码。
dd的好处是可以只复制文件的某一部分。
dd if=<src> of=<tar>
- dd备份
dd if=/dev/sda of=/mnt/usb/mdr.bak bs=512 count=1
dd if=/mnt/usb/mdr.bak of=/dev/sda bs=512 count=1
- 每次复制512byte,共复制1次
- 用dd做磁盘镜像
dd if=/path/dev of=/path/xxx.iso bs=1M count=1024
- 还可以用来做磁盘性能测试
- dd备份
fstab文件
文件系统配置文件/etc/fstab
文件系统表。初始化时会自动挂载此文件中定义的每个文件系统
1 | 要挂载的设备 挂载点 文件系统类型 挂载选项 转储频率 文件系统检测次序 |
mount命令
mount DEVICE MOUNT_POINT
-o loop
挂载本地回环设备。如iso镜像-a
挂载定义在fstab中的所有文件系统
当umount
busy时,可以使用fuser -v /mount/point
查看谁在访问。使用fuser -km /mount/point
杀死所有进程
文件压缩与归档
对于文本文件,会发现压缩比非常打,这是因为对文本文件的压缩,是对文本进行标记,以后该文本再次出现时,使用标记代替文本,以达到压缩的目的。算法不同压缩比也可能不同。
- 目流行的压缩格式(工具):xz(zx), bz2(bzip2), gz(gzip)。只能压缩文件,不能压缩目录。默认还会删除原文件。
- gzip
- 压缩
gzip <FILE>
-[1-9]
指定压缩比
- 解压缩
gunzip <FILE>
或gzip -d <FILE>
zcat
在不解压的情况下查看文本文件的内容
- 压缩
- bz2
bzip2
压缩,对于大文件比gzip有更大压缩比的工具,格式近似-d
解压缩-k
压缩保留源文件bunzip2
解压bzcat
- xz
- 格式类似
man xz
- 格式类似
- zip
- 压缩比不大,但可以压缩目录,格式也独特
zip OUT_FILE.ZIP IN_FILE1 ...
- 这种能将多个文件整合在一起就叫archive(归档)
- gzip
- 归档工具,只归档不压缩,体积还会变大
- tar
-c
创建归档文件-f
FILE` 操作的文件-x
展开归档, 一般用-xf
--xattrs
归档时保留其扩展属性信息-t
查看归档里有啥
- tar
- 即归档又压缩
- 当然可以先使用tar归档,再压缩。但是可以直接一步到位
-zcf
归档然后调用gzip压缩-zxf
调用gzip解压缩然后展开归档-jcf
,-jxf
调用bz2-Jcf
,-Jxf
调用xz- 展开时使用的工具可以省略,如
-xf
- 当然可以先使用tar归档,再压缩。但是可以直接一步到位