本次课内容:
这些任务都有一个很复杂但容易上手的工具来完成
ping www.baidu.com
- 查看网络基本状态df /
- 查看磁盘分区使用情况fdisk /dev/sdb
- 对磁盘进行分区poweroff
- 关机find . -name "*.[ch]"
- 查找当前目录下的.c和.h文件grep "\bint i\b" a.c
- 查找文件中定义变量i的位置wc a.c
- 统计文件的行数/单词数/字符数apt-get install gcc
- 一键下载安装新工具wget http://www.xxx.com/abc.zip
- 下载文件iconv -f gbk -t utf-8 file.txt
- 文件编码转换有什么好处? 这些在windows下点点鼠标也能做
例子: 比较两个文件是否完全相同
Linux的解决方案
vimdiff file1 file2
diff file1 file2
md5sum file1 file2
也许你在Windows中下载了一个计算MD5的GUI工具
也许你觉得一次也省不了多少时间
例子: 列出一个C语言项目中所有被包含过的头文件
这体现了Unix哲学
Windows的GUI工具之间几乎无法组合
.bashrc
, /etc/profile
,
/etc/rcS.d/S01udev
, …strace
, ltrace
, …
Windows的目标是大众人群, “易上手”是最重要的
命令格式:
例: 查看当前目录下的文件
$ ls -l -a # 也可以把选项合并成ls -la
total 56K
drwxr-xr-x 2 yzh yzh 4096 Sep 11 09:52 . --> 当前目录
drwxr-xr-x 10 yzh yzh 4096 Sep 10 19:51 .. --> 父目录
-rw-r--r-- 1 yzh yzh 34565 Sep 4 10:48 01.md
-rw-r--r-- 1 yzh yzh 9314 Sep 11 09:36 02.md
|\./\./\./ | \./ \./ \.../ \........../ +--> 文件名
| | | | | | | | +------------> 上次修改日期
| | | | | | | +---------------------> 文件大小(字节)
| | | | | | +--------------------------> 文件所属组
| | | | | +------------------------------> 文件所属用户
| | | | +---------------------------------> 硬链接数量
| | | +-------------------------------------> 其他用户权限
| | +----------------------------------------> 组内用户权限
| +-------------------------------------------> 所属用户权限
+---------------------------------------------> 文件类型
~
表示/home/当前用户/
Busybox套件(包含常用的Linux命令行工具)将工具分为如下类别:
标准Linux的工具更多: /bin
目录下有上千个工具
如果需要安装工具, 但不知道在哪个包, 可以在包搜索页面搜索
打开黑盒的方法
一个重要的踪迹工具: strace
例1: ls
如何运行
例2: ls
如何被寻找?
作为和操作系统交互的界面, shell具有很多方便的功能
Tab
键自动补全A-f
和A-b
按键来按单词移动光标
man readline
history
命令查看历史命令
!n
(n
为历史命令的编号)再次执行命令!xxx
再次执行以xxx
开头的最近一条命令cd -
返回上一个工作目录*
(任意长度的任意字符串),
?
(任意一个字符)和[...]
(集合中的任意一个字符){...}
(例:
echo Hello-{a,bb,ccc}-{1,2}!
)可以写入~/.bashrc
文件, 打开终端时生效, 无需重复设置
常见的Linux rm
梗, 请谨慎尝试 🙃
一种用于字符串匹配的编程语言
grep
, awk
, sed
,
vim
等工具使用
例: 匹配email
通过命令行模拟窗口管理的功能
C-Z
+ bg
&
指定后台运行jobs
fg
kill
kill -9 进程号
强行关闭
任务管理器 - ps aux
, top
,
htop
Linux上的程序在运行时默认打开了3个文件, 通过 “文件描述符”来编号:
可通过lsof -p 进程号
来查看打开的文件
向文件追加输出
可将标准错误重定向到文件
将标准输入重定向到文件, 无需手动输入
管道 = 一个用于连接程序间输入输出的缓冲区
+-------+ stdout +------+ stdin +-------+
| prog1 | --------> | pipe | -------> | prog2 |
+-------+ +------+ +-------+
例:
xargs
: 一个特殊的命令,
可以将标准输入转变为命令的参数
青春版直播时钟
watch -t -n 1 "echo -n '第六期一生一芯 | 周六 15:00~17:00 | '; \
date; echo '课程主页 https://ysyx.oscc.cc/docs/'"
无人值守重试操作
while ! git push origin HEAD; do echo "retry"; done
while [[ `seq 1 10 | shuf | head -n 1` != "1" ]]; do echo "retry"; done
自制CPU主频监视器
打包特定文件并上传到远端
把命令写到一个文件里面
echo $PATH | tr -t : '\n' | xargs -I{} find {} -maxdepth 1 -type f -executable | \
xargs file -b -e elf | sort | uniq -c | sort -nr
结果: 大部分是可执行文件(ELF), 小部分是脚本
1365 ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV)
187 POSIX shell script, ASCII text executable
106 Perl script text executable
52 ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux)
32 Python script, ASCII text executable
26 Bourne-Again shell script, ASCII text executable
17 ELF 64-bit LSB executable, x86-64, version 1 (SYSV)
12 setuid ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV)
8 POSIX shell script, Unicode text, UTF-8 text executable
7 setgid ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV)
7 ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux)
2 Python script, Unicode text, UTF-8 text executable
1 Tcl/Tk script, ASCII text executable
1 Python script, ISO-8859 text executable
1 POSIX shell script, ASCII text executable, with very long lines (933)
1 POSIX shell script, ASCII text executable, with very long lines (456)
1 POSIX shell script, ASCII text executable, with very long lines (317)
1 Paul Falstad's zsh script, ASCII text executable
1 Java source, Unicode text, UTF-8 text
if
, for
, while
,
case
…等控制流man bash
一个例子
main()
函数的参数getopt()
库函数识别并处理参数fopen()
打开文件fscanf()/fread()
从标准输入读取fprintf()/fwrite()
将结果写入到标准输出main()
函数的返回值 = 命令的返回值
main()
函数的原型
一个示例: 输出参数(argv.c)
准确地说: 卸载Windows GUI工具给你安装的思想枷锁
自我觉醒
如果你不玩现代游戏, 可以考虑装个Windows虚拟机
最重要的Linux命令: man
man man
- 学习如何RTFMman ls
- 查看如何使用ls命令man 3 printf
- 学习如何使用库函数printfman -k xxx
- 检索含有关键字含有xxx的命令
学会使用man
, 你就能学会使用Linux上的一切
以下工具覆盖了程序员绝大部分的需求
文件管理 - cd, pwd, mkdir, rmdir, ls, cp, rm, mv, tar
文件检索 - cat, more, less, head, tail, file, find
输入输出控制 - 重定向, 管道, tee, xargs
文本处理 - vim, grep, awk, sed, sort, wc, uniq, cut, tr
正则表达式
任务管理 - jobs, ps, top, kill, free, lsof
用得多就记住了, 如果记不住
-h
, --help
等选项查看帮助信息man
更多工具的介绍
想做一件事, 很大概率别人已经做过了
例1: 想打开pdf文件
evince
打开apt-get install evince
-> evince a.pdf
-> 解决例2: 想给终端分屏
tmux
分屏工具apt-get install tmux
-> 不会用tmux
的使用man tmux
-> 解决
RTFM + STFW能帮你一辈子
搜索引擎 | 百科 | 问答网站 | |
---|---|---|---|
提高效率 | www.google.com | en.wikipedia.org | stackoverflow.com |
浪费生命 |
随着问题技术含量提高, 百度搜索结果越来越不靠谱
正确做法
强烈不建议使用中文关键字/安装中文系统 - 否则你会错过很多
初学者慎用!
对于未知, 人都有恐惧和懒惰的惯性
对于短期负收益的事情, 人都会聪明地选择逃避
对于未知, 人都有恐惧和懒惰的惯性
对于短期负收益的事情, 人都会聪明地选择逃避
学习使用Linux是一个成本低, 成功率高的锻炼机会
学校的大部分实验课都会安排助教手把手装系统/配环境
在我们看来, 装系统/配环境并不是 “无关的事情”
带着这种信念做实验, 你会收获很多
使用工具 = 编程
学习工具首先需要端正心态 - 我真的想提高效率
短时间的投入是负收益, 但这些技能会让你终身受益