“Waiting is wasting for people like me.”——《Wind》
帮助命令
命令 |
作用 |
type |
查看命令类型 |
help |
内部命令帮助 |
man |
外部命令帮助 |
whereis |
命令位置 |
file |
文件类型 |
ps -fe |
进程列表 |
- man 命令在部分 Linux 发行版中需要单独安装
- man 命令可以查询种类繁多的手册,包括
man ascii
、man utf-8
等
- shell 命令的执行:
- shell 是一个解释器和执行器,使用空白符切割指令。切割得到的第一个元素被识别为命令。这是为什么 [ 命令后面必须有空格的原因
- shell 首先会判断是内部还是外部命令。如果是外部命令,则进入 $PATH 变量给定的目录中寻找
- shell 会将使用过的命令缓存在内存 hash 中。使用
hash -r
命令可以清除这些缓存
- 一些脚本代码第一行会以类似于
#!/usr/bin/python
的格式给出解释器位置,这样的脚本可以省去命令直接执行
- 执行这样的脚本必须使用
./file
的格式,因为直接写file
的话 shell 会将其当成一个命令前往 $PATH 中寻找
- 外部命令都是程序,都有独立的进程
文件系统命令
命令 |
作用 |
ls |
显示目录 |
df |
磁盘使用情况 |
du |
文件系统使用情况 |
cd |
切换工作目录 |
pwd |
当前工作目录 |
mkdir |
创建目录 |
rm |
删除 |
cp |
拷贝 |
mv |
移动 |
ln |
链接 |
stat |
查看元数据 |
touch |
修改文件或目录的时间属性,也可创建文件 |
ls -l
命令显示文件详细信息,包括:
- 文件类型
- -:普通文件(f)
- d:目录文件
- b:块设备文件(block)
- c:字符设备文件(character)
- l:符号链接文件(symbolic link file)
- p:命令管道文件(pipe)
- s:套接字文件(socket)
- 文件权限:共 9 位,每 3 位一组,分别代表文件文件(U,G,O);每组三位,分别代表读、写和执行(rwx)
- 文件硬链接次数
- 文件属主(owner)
- 文件属组(gourp)
- 文件大小
- 时间戳
- 访问(access)
- 修改(modify)
- 元数据(change)
- 文件系统层次化标准(Filesystem Hierarchy Standard)
- /boot:系统启动相关的文件,如内核、initrd、grub(bootloader)等
- /dev:设备文件(一切皆文件)
- /etc:配置文件
- /home:用户家目录
- /root:管理员家目录
- /lib:库文件
- /media:挂载点目录,移动设备
- /mnt:挂载点目录,额外的临时文件系统
- /opt:可选目录,程序的自定义安装目录
- /proc:伪文件系统,内核映射文件
- /sys:伪文件系统,于硬件设备相关的属性映射文件
- /tmp:临时文件,/var/tmp
- /var:可变化的文件
- /bin:可执行文件
- /sbin:管理命令
- Linux 的目录结构可以规避磁盘挂载带来的移植性问题,即不管目录挂载在哪一块磁盘,目录结构都是一样的
- Linux 开机引导顺序:
- 激活主板 bios 芯片,bios 程序进入内存,决定引导位置(光驱、硬盘等)
- bios 包含 CPU 相关信息、设备启动顺序、硬盘、内存、时钟、PnP 特性等重要信息
- 读取 MBR(Master Boot Record)
- bootloader 读取分区格式,使用不同解码器
- 分区内包含各自 kernel;bootloader 将 kernel 加载到内存。向 CPU 发送 reset 指令,覆盖内存内容,重新分配地址空间
- kernel 挂载磁盘分区,找到 sbin 目录下的 init 程序;根据 init 程序启动其它程序(login 程序以及登陆成功后的 shell 等)
关于开机引导上面的只是粗略的一个过程,详细可以参考linux开机过程
- 内存被分为内核地址空间和其它地址空间。内核地址空间是专为内核开辟的,受保护的地址空间
- 9999 个 a 和一个汉子在 utf-8 编码下占用多少字节?答案是 10002 个。utf-8 字符是变长的,除了节省空间,更能节省 IO
cd
命令回到家目录,cd -
命令回到上之前打开的目录
mkdir -p
递归创建;mkdir /path/to/{x,y,z}
水平创建
- 尽量用 mv 代替 rm
- 硬链接类似于指针,删除一个硬连接文件还在且不影响其它指向这个文件的硬连接;软链接类似于快捷方式,源文件删除,软链接会失效
- touch 可以改变文件元数据,配合其它命令和脚本可以实现异地备份、异常中断等功能
文件操作命令
命令 |
作用 |
cat |
全文查看文件内容 |
more |
分屏查看文件内容,到文件底部自动结束 |
less |
分屏查看文件内容,到文件底部不自动结束 |
head |
查看文件开头 |
tail |
查看文件结尾 |
| |
管道命令 |
xargs |
参数命令 |
- more 和 less 的区别可以理解成,后者翻到最后之后还可以往回翻,而前者看到最后就退出程序
- head 和 tail 使用管道连接在一起可以查看文件特定区间的内容,例如
head -5 | tail -1
查看第 5 行
- xargs 从标准输入读取内容,并将其作为后面命令(参数)的参数执行
- 管道会在两边分别新建一个子进程,因此要格外注意新建子进程与七步扩展的优先级顺序
关于 vim 的内容在其它文章中
数据处理
命令 |
作用 |
grep |
显示匹配行 |
cut |
垂直切割数据 |
sort |
排序 |
wc |
word count |
sed |
行编辑器,类似于 vim 的末行模式 |
awk |
文本分析工具 |
grep -v
反选,grep -e
使用扩展正则表达式
- 正则表达式(加粗为基本表达式,不加粗为扩展表达式):
- 匹配操作符
- \:转义字符
- .:匹配任意单个字符
- [123a]:字符序列单字符占位
- ^:行首
- $:行尾
\<
,\>
:单词首尾边界
- |:连接操作符
- (,):选择操作符
- \n:反向引用
- 重复操作符
- ?:匹配 0 次 到 1 次
- *:匹配 0 次到多次
- +:匹配 1 次到多次
- {n}:匹配 n 次
- {n,}:匹配 n 次到多次
- {n,m}:匹配 n 到 m 次
- grep 中使用正则表达式要用双引号包裹作为引用
关于 cut、sort、wc、sed、awk 命令的详细使用在另一篇文章中
权限管理
命令 |
作用 |
groupadd |
添加组 |
groupdel |
删除组 |
useradd |
添加用户 |
userdel |
删除用户 |
usermod |
修改用户 |
id |
查看用户元数据 |
passwd |
修改密码 |
sudo |
以管理员身份运行 |
su |
切换用户 |
chmod |
修改文件权限 |
chown |
修改用户属组或属主 |
- rwx 权限可以表示为三位二进制数,Linux 支持直接用十进制数表示权限。例如 7 表示拥有全部的三种权限
Shell 脚本编程
- shell 本质是一个解释器和启动器,能够解释用户交互输入和文本文件输入。脚本的本质是指明解释器和启动器的代码文件。
- 使用
source file
会在当前 shell 运行脚本;使用/bin/bash file
会新建一个进程打开 shell 运行脚本
- 对于指定了解释器的脚本应该使用
./file
的格式,因为直接写file
的话 shell 会将其当成一个命令前往 $PATH 中寻找
文本流和重定向
- 重定向不是命令
- 任何程序都带有默认 IO
- IO 流指向虚拟终端,
cd /proc/$$/fd
可以查看(/dev/pts/0,1,2);通过修改指向的虚拟终端可以做到一个 bash 输入,另一个 bash 输出
- 输出重定向:修改程序的 1 或 2(左边与文件描述符之间不能有空格)
- >:覆盖重定向
- >>:追加重定向
- &>,&>:同时重定向 1 和 2(两个符号中间不能有空格)
- 输入重定向:修改程序的 0
- <:文件
- <<:输入多行(首先输入一个自定义的字符串作为识别标记,按下回车后开始输入多行。输入完成后再次输入前面的识别标记)
- 一个简单的例子:在脚本中要用一个 echo 打印多行文本,需要使用一个外部文件,安全性较低;使用多个 echo 不方便调整格式;cat 加多行重定向可以解决这些问题,同时容易调整格式
- <<<:字符串(双引号)
- read 命令对换行符敏感,可以读取标准输入
- exec 命令在现有进程上运行一个可执行文件,替换原有的可执行文件同时不改变进程号
- 全重定向的 socket 案例(获取百度主页)
1 2 3
| exec 8<> /dev/tcp/www.baidu.com/80 echo -e "GET / HTTP/1.0\n" >& 8 cat <& 8
|
Shell 脚本
这一部分涉及变量、参数、数组、运算符、流程控制等丰富内容,将会在另一篇文章中进行总结