抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

Linux哲学

  • Linux基本原则
      1. 由目的单一的小程序组成,组合小程序完整复杂任务
      1. 一切皆文件
      1. 避免捕获用户接口,避免与用户交互
      1. 配置文件保存为纯文本格式
  • 命令格式命令 选项 参数
    • 短选项:-加某个字母,如-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 VS 2>&1 >/dev/null
          • 前者1定向到null,2再定向到1定向的文件(null)
          • 前者1定向到null,2再定向到1定向的文件(stdout),然后1才定向到null
        • 为什么不用>/path/to 2>/path/to
          • 这种方法,标准输出和错误输出会抢占out文件的管道,因此输出的顺序无法估计
    • 输入重定向
      • <输入重定向
      • <<Here Document
        1
        2
        3
        echo << END_SIGN
        > hello
        > END_SIGN
    • 关闭/打开文件描述符(输入输出)
      • [n]>&-[n]<&-,都是把文件描述符n关闭
      • [n]<>file,打开file,指定其文件描述符为n,不指定默认为0
      • exec 1>&-后尝试echo mess将会失败
      • exec closed_fd>new_fdexec 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,声明整形变量SUM
    • declare -x A=0,声明export变量A

条件分支

1
2
3
4
5
6
7
if expression; then
statement
elif
statement
else
statement
fi
  • 条件测试的表达式
    • [ expression ]注意 中扩号两端的空格是必须的
    • [[ expression ]],两种方法用法相同,但是两个中括号是bash的关键字
    • test expression
    • 因为if语句取的是表达式执行状态的结果,所以如果条件判断是命令则不需要中括号,如if test expression; then
  • shell中进行算数运算
    • shell把所有的变量都当作字符,所以要进行算数运算需要额外操作
      1. let,见help let。如let c=$a+$b
      1. $[expression]。如c=$[$a+$b]
      1. $(())。如c=$(($a+$b))
      1. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
case SWITCH in
value1)
statement
...
;;
value2|value3)
statement
...
;;
[0-9])
statement
...
;;
*)
statement
...
;;
esac

文本处理

sed

流编辑器(Stream EDitor, sed)。行编辑器。默认将输出到屏幕

sed [option] 'AddressCommand' file...

  • option
    • -n静默模式,不再显示模式空间中的内容
    • -i修改原文件
    • -r使用扩展正则表达式
  • Address:
      1. Startline,Endline
        • $ 表示最后一行
      1. /RegExp/
      1. /pattern1/,/pattern2/
        • 从被1匹配到的行开始到被2匹配的行结束
      1. Startline, +N
        • 从起始行开始向后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
2
                         主设备号  次设备号             
crw-rw----+ 1 root video 81, 2 Aug 31 17:04 video2

文件系统

文件系统类型众多,接口可能各异,软件开发不可能要为每种文件系统的不同接口编写代码,那就本末倒置了。所以 Linux使用VFS(虚拟文件系统)作为翻译官 以支持众多文件系统。

linux常用的文件系统有ext3、ext4、xfs…

创建文件系统:mkfs

  • 格式化
    • 高级格式化:创建文件系统mkfs

内存

linux使用线性虚拟内存做中介,从虚拟内存映射到物理内存。当物理内存满时,将闲置的程序内存放到交换空间。

查看内存以及交换空间free,默认单位是字节,free -m以兆为单位显示。

  • 交换空间扩容
      1. 新建分区
      1. 创建交换分区文件系统mkswap /path/dev
      1. 启用交换空间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
      • 还可以用来做磁盘性能测试

fstab文件

文件系统配置文件/etc/fstab文件系统表。初始化时会自动挂载此文件中定义的每个文件系统

1
2
3
要挂载的设备 挂载点 文件系统类型 挂载选项 转储频率 文件系统检测次序
转储频率 表示多长时间(天)做次备份
文件系统检测次序 只有根可以为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(归档)
  • 归档工具,只归档不压缩,体积还会变大
    • tar
      • -c创建归档文件
      • -fFILE` 操作的文件
      • -x展开归档, 一般用-xf
      • --xattrs归档时保留其扩展属性信息
      • -t查看归档里有啥
  • 即归档又压缩
    • 当然可以先使用tar归档,再压缩。但是可以直接一步到位
      • -zcf归档然后调用gzip压缩
      • -zxf调用gzip解压缩然后展开归档
      • -jcf, -jxf调用bz2
      • -Jcf, -Jxf调用xz
      • 展开时使用的工具可以省略,如-xf

评论