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>&1VS2>&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
- 引用:
$VAENAMEor${VARNAME},注意$()是引用执行结果,而{}才是引用内容 - 环境变量:作用域为当前shell或器子进程
- 用
export导出,export var=value
- 用
- 位置变量
$0, $1, ...,所有参数,第一个参数…shift [n],把第一个变量弹出。因此有很多变量时可以使用shift
- 特殊变量
$?,上一个命令的执行状态返回值,0正确,1~255执行错误$#,参数个数$*,参数列表$@,参数列表
- 声明
declare [OPTION] VAR=VALUEdeclare -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 FILEchmod u-s FILE- 如果FILE本身就有执行权限,则SUID显示为s,否则为S
GUID:文件运行时,相应进程的属组是程序文件自身的属组,而非启动者所属的基本组
chmod g+s FILEchmod g-s FILE
Sticky:在一个公共目录,每个用户都可以创建文件,删除自己的文件,但不能删除别人的文件
chmod o+t DIRchmod o-t DIR
也可用
111,二进制表示FACL, Filesystem Access Control List
setfacl OPTION FILE-m,设定u:UID:permg: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=1dd 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中的所有文件系统
当umountbusy时,可以使用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创建归档文件-fFILE` 操作的文件-x展开归档, 一般用-xf--xattrs归档时保留其扩展属性信息-t查看归档里有啥
- tar
- 即归档又压缩
- 当然可以先使用tar归档,再压缩。但是可以直接一步到位
-zcf归档然后调用gzip压缩-zxf调用gzip解压缩然后展开归档-jcf,-jxf调用bz2-Jcf,-Jxf调用xz- 展开时使用的工具可以省略,如
-xf
- 当然可以先使用tar归档,再压缩。但是可以直接一步到位