鸟哥的Linux私房菜笔记
常用命令
ls -al name*:查看包括匿名文件/目录的全部文件、查看文件/目录的详细信息、并且过滤出文件名带name的文件/目录
pwd -P:查看当前目录的所在PATH,如果是链接的快捷PATH的会显示正确地址
mkdir -p name/name/name:可以递归创建多级目录
mkdir -m 771 name:创建带权限的目录
cp/rm -i:复制/删除。如已存在,询问是否覆盖
cp/rm -r:递归复制/删除
cp -a:将文件权限、所属、创建日期等信息原样复制
cat -n或nl:带行号
which name:查找命令位置。bash内指令无法查找
whereis:从特定目录查找文件名。具体目录whereis -l查看
locate:从已建立的数据库查找/var/lib/mlocate
find:比较操硬盘的查找
df -h:更可读的磁盘容量形式
文件权限
文件权限-rwxrwx—:
第一个字符
- 当为[d]则是目录,例如上表档名为『.config』的那一行;
- 当为[-]则是文件,例如上表档名为『initial-setup-ks.cfg』那一行;
- 若是[l]则表示为快捷方式(link file);
- 若是[b]则表示为设备与装置文件(device),提供系统随机存取的接口设备,如硬盘;
- 若是[c]则表示为设备与装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
其余字符,三个为一组,均为[rwx],r可读、w可写、x可执行、-为无权限
- 第一组为『文件拥有者可具备的权限』
- 第二组为『加入此群组之账号的权限』
- 第三组为『其他账号的权限』
文件配置/存放方法:FHS
FHS订定出来的四种目录特色
FHS所定义的三层主目录:
- / (root, 根目录):与开机系统有关;
- /usr (unix software resource):与软件安装/执行有关;
- /var(variable):与系统运作过程有关。
命令示例
chmod数字类型改变文件权限
rwx=421
1 |
|
chmod符号类型改变文件权限
u=user、g=group、o=others、a=all
1 |
|
+(加入)、-(除去)、=(设定)
1 |
|
文件压缩
常见的压缩指令有gzip, bzip2, xz。
压缩率最佳的是xz,若可以不计时间成本,建议使用xz 进行压缩。
1 |
|
vim
wq保存退出
/搜索
小数点『. 』为重复进行前一次动作
按键 | 作用 |
---|---|
v | 字符选择 |
V | 列选择 |
ctrl+v | 长方形式选择 |
u | 撤回 |
y | 复制所选 |
d | 删除所选 |
p | 粘贴所选 |
yy | 复制整列 |
dd | 删除整列 |
[number]G | 移动到这个文件的第 number 列 |
G | 移动到这个文件的最后一列 |
gg | 移动到这个文件的第一列 |
[number] | 光标向下移动 number 列 |
/word | 向下查找单词 |
?word | 向上查找单词 |
ctrl+r | 重复上个操作 |
:sp {filename} 可以实现分屏,上面为当前窗口,下面为初始打开使用sp冻结的文档。
使用ctrl+w+↑/↓可切换当前窗口。ctrl+w+q离开当前窗口
磁盘与文件系统
磁盘、操作系统与文件系统
在Linux系统中,每个装置都被当成一个文件来对待,每个装置都会有装置文件名。
磁盘的文件名:
/dev/sd[a, b, c]实体磁盘文件名
/dev/vd[a, b, c]虚拟磁盘文件名
整个开机流程到操作系统之前的动作应该是这样的:
- BIOS:开机主动执行的韧体,会认识第一个可开机的装置;
- MBR:第一个可开机装置的第一个扇区内的主要启动记录区块,内含开机管理程序;
- 开机管理程序(boot loader):一支可读取核心文件来执行的软件;
- 核心文件:开始操作系统的功能…
开机的流程:BIOS–>MBR–>–>boot loader–>核心文件
操作系统会控制所有的硬件并且提供核心功能,因此我们的计算机就能够认识硬盘内的文件系统,并且进一步的读取硬盘内的软件文件与执行该软件来达成各项软件的执行目的。
文件系统是建立在磁盘上面的,一个可以被挂载的数据通常称为『文件系统, filesystem』
文件系统通常会将文件权限(rwx)与文件属性(拥有者、群组、时间参数等)的数据分别存放在不同的区块,权限与属性放置到inode 中,至于实际数据则放置到data block 区块中。
另外,还有一个超级区块(superblock) 会记录整个文件系统的整体信息,包括inode 与block 的总量、使用量、剩余量等。
实体链接与符号链接
1 |
|
实体链接不能夸文件系统、不能链接目录。
符号链接建立一个独立的文件,文件指向链接的文件。类似win快捷方式
图为实体链接的文件读取示意图。
两个不同inode,不同的指向的文件PATH,文件PATH中的block指向含有真实data的inode。
符号链接的文件读取示意图。
磁盘分区、挂载、卸除
MBR(Master Boot Record, 主要开机纪录区) 的方式可以用来处理开机管理程序与分区表,是可以安装开机管理程序的地方。
GPT 分区:某些操作系统要使用GPT 分区时,必须要搭配UEFI 的新型BIOS 格式才可安装使用
MBR 分区表请使用fdisk 分区,GPT 分区表请使用gdisk 分区!
CSDN:loop是表示整盘分区的,意思就是整个硬盘作为一个独立的分区
挂载
1 |
|
卸除
1 |
|
SWAP交换分区
用途:可以暂时将内存的程序拿到硬盘中暂放的内存置换空间(swap)
步骤:
- 分区:先使用 gdisk/fdisk 在你的磁盘中分区出一个分区槽给系统作为swap 。由于Linux 的gdisk 预设会将分区槽的ID 设定为Linux 的文件系统,所以你可能还得要设定一下system ID 就是了。
- 格式化:利用建立swap 格式的『mkswap 装置文件名』就能够格式化该分区槽成为swap 格式
- 使用:最后将该swap 装置启动,方法为:『swapon 装置文件名』。
- 观察:最终透过free 与swapon -s 这个指令来观察一下内存的用量
命令示例
查看文件系统的磁盘用量
1 |
|
- Filesystem:代表该文件系统是在哪个partition ,所以列出装置名称;
- Used:顾名思义,就是使用掉的磁盘空间啦!
- Available:也就是剩下的磁盘空间大小;
- Use%:就是磁盘的使用率啦!如果使用率高达90% 以上时,最好需要注意一下了,免得容量不足造成系统问题喔!(例如最容易被灌爆的/var/spool/mail 这个放置邮件的磁盘)
- Mounted on:就是磁盘挂载的目录所在啦!(挂载点啦!)
列出系统上的所有磁盘列表
1 |
|
- NAME:就是装置的文件名啰!会省略 /dev 等前导目录!
- MAJ:MIN:其实核心认识的装置都是透过这两个代码来熟悉的!分别是主要:次要装置代码!
- RM:是否为可卸除装置(removable device),如光盘、USB 磁盘等等
- SIZE:当然就是容量啰!
- RO:是否为只读装置的意思
- TYPE:是磁盘(disk)、分区槽(partition) 还是只读存储器(rom) 等输出
- MOUTPOINT:就是前一章谈到的挂载点!
blkid 列出装置的UUID 等参数
parted 列出磁盘的分区表类型与分区信息。可以通过parted -l显示的Partition Table查看是什么类型的分区系统
1 |
|
BASH
Shell(壳程序)作为应用程序,通过向Kernel(操作系统核心)发送指令,达到操作硬件设备/操作系统的目的。
只要能够操作应用程序的接口都能够称为壳程序。比如bash(Bourne Again SHell)。
系统上合法的shell需要写入/etc/shells文件,以限制服务使用者能够使用的shells。
使用者通过/cat /etc/passwd
获取的最后一个数据即为可以取得的预设shell。如下的/bin/bash
和/sbin/nologin
1 |
|
变量
变量调用:$var
输出:echo ${var}
。推荐用法
echo $var
赋值:name=FishingRod
。无引号不能空格
name="My name is FishingRod"
name='FishingRod\'s name'
可用\
转义PATH=${PATH}:/home/dmtsai/bin
变量添加- 其中
${PATH}
可以是"$PATH"
或$PATH
- 其中
- 可以活用,
『version=$(uname -r)』
再『echo $version』
可得『3.10.0-1160.76.1.el7.x86_64』
环境变量:export name
。供其他程序执行
取消变量:unset name
read
键入:将用户键入字符变为变量。read test
并echo ${test}
查看。
[dmtsai@study ~]$ read -p "Please keyin your name: " -t 30 named Please keyin your name: VBird Tsai # 注意看,会有提示字符! [dmtsai@study ~]$ echo ${named}
1
2
3
4
5
6
7
8
9
10
11
12
13
declare:可以将变量变为环境变量`-x`、只读`-r`、变为非环境变量`+x`。
#### 不同类型
数组:
```bash
[dmtsai@study ~]$ var[1]="small min"
[dmtsai@study ~]$ var[2]="big min"
[dmtsai@study ~]$ var[3]="nice min"
[dmtsai@study ~]$ echo "${var[1]}, ${var[2]}, ${var[3]}"
small min, big min, nice min
命令
别名 alias:将命令赋予别名。
通过lm
直接运行ls -al
。
1 |
|
env:列出当前环境变量
1 |
|
set:观察所有变量
1 |
|
locale:-a查看支持语系。
通常仅设定LANG
或LC_ALL
这两个变量,中文建议设置LC_ALL
1 |
|
- 让
LC_ALL
生效,需要使用export
转成环境变量。export LC_ALL=en_US.utf8
通配符
符号 | 意义 |
---|---|
* | 代表『0 个到无穷多个』任意字符 |
? | 代表『一定有一个』任意字符 |
[ ] | 同样代表『一定有一个在括号内』的字符(非任意字符)。例如[abcd] 代表『一定有一个字符,可能是a, b, c, d 这四个任何一个』 |
[ -] | 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如[0-9] 代表0 到9 之间的所有数字,因为数字的语系编码是连续的! |
[^ ] | 若中括号内的第一个字符为指数符号(^) ,那表示『反向选择』,例如[ ^abc ] 代表一定有一个字符,只要是非a, b, c 的其他字符就接受的意思。 |
1 |
|
其他特殊符号
符号 | 内容 |
---|---|
| | 管线(pipe):分隔两个管线命令的界定 |
! | 逻辑运算意义上的『非』not 的意思 |
>, >> | 数据流重导向:输出导向,分别是『取代』与『累加』 |
<, << | 数据流重导向:输入导向 |
; | 连续指令下达分隔符:连续性命令的界定(注意!与管线命令并不相同) |
1 |
|
1 |
|
EOF
1 |
|
Shell Script
Shell Script 程序化脚本,将多个shell语法与指令搭配正则、管线命令、数据流重导向等功能结合为一个程序文件
执行差异
直接执行shell脚本时(如bash、shell
),是在新的bash环境中执行的,子程序内的用户自定义变量不会被保存到父程序。
使用source
执行指令使得脚本文件在父程序中执行,脚本中的用户自定义变量可以正常调用。
1 |
|
${}
的其他用法
1 |
|
案例
输入与输出
1 |
|
强化,并建立文件
1 |
|
数值运算
1 |
|
判断
1 |
|
if语句
1 |
|
使用netstat -tuln
获取目前已启动的服务端口
1 |
|
case…esac语句
1 |
|
脚本输入参数
1 |
|
shift可以拿掉参数
1 |
|
函数
1 |
|
循环
1 |
|
1 |
|
1 |
|
1 |
|
debug
1 |
|
test,检测文件是否存在
1 |
|
标志 | 意义 |
---|---|
关于某个档名的『文件类型』判断 | 如test -e filename 表示存在否 |
-e | 该『档名』是否存在?(常用) |
-f | 该『档名』是否存在且为文件(file)?(常用) |
-d | 该『文件名』是否存在且为目录(directory)?(常用) |
-b | 该『档名』是否存在且为一个block device 装置? |
-c | 该『档名』是否存在且为一个character device 装置? |
-S | 该『档名』是否存在且为一个Socket 文件? |
-p | 该『档名』是否存在且为一个FIFO (pipe) 文件? |
-L | 该『档名』是否存在且为一个连结档? |
关于文件的权限侦测 | 如test -r filename 表示可读否(但root 权限常有例外) |
-r | 侦测该档名是否存在且具有『可读』的权限? |
-w | 侦测该档名是否存在且具有『可写』的权限? |
-x | 侦测该档名是否存在且具有『可执行』的权限? |
-u | 侦测该文件名是否存在且具有『SUID』的属性? |
-g | 侦测该文件名是否存在且具有『SGID』的属性? |
-k | 侦测该文件名是否存在且具有『Sticky bit』的属性? |
-s | 侦测该档名是否存在且为『非空白文件』? |
两个文件之间的比较 | 如:test file1 -nt file2 |
-nt | (newer than)判断file1 是否比file2 新 |
-ot | (older than)判断file1 是否比file2 旧 |
-ef | 判断file1 与file2 是否为同一文件,可用在判断hard link 的判定上。主要意义在判定,两个文件是否均指向同一个inode 哩! |
关于两个整数之间的判定 | test number1 -eq number2 |
-eq | 两数值相等(equal) |
-ne | 两数值不等(not equal) |
-gt | number1 大于number2 (greater than) |
-lt | number1 小于number2 (less than) |
-ge | number1 大于等于number2 (greater than or equal) |
-le | number1 小于等于number2 (less than or equal) |
判定字符串的数据 | |
test-z string | 判定字符串是否为0 ?若string 为空字符串,则为true |
test -n string | 判定字符串是否非为0 ?若string 为空字符串,则为false。注:-n 亦可省略 |
test str1 == str2 | 判定str1 是否等于str2 ,若相等,则回传true |
test str1 != str2 | 判定str1 是否不等于str2 ,若相等,则回传false |
多重条件判定 | 例如:test -r filename -a -x filename |
-a(and) | 两状况同时成立!例如test -r file -a -x file,则file 同时具有r 与x 权限时,才回传true。 |
-o(or) | 两状况任何一个成立!例如test -r file -o -x file,则file 具有r 或x 权限时,就可回传true。 |
! | 反相状态,如test ! -x file ,当file 不具有x 时,回传true |