本次课内容:
这些任务都有一个很复杂但容易上手的工具来完成
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 CLI的解决方案
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 GUI的目标是大众人群, “易上手”是最重要的
命令格式:
例: 查看当前目录下的文件
$ 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命令行工具)将工具分为如下类别:
如果需要安装工具, 但不知道在哪个包, 可以在包搜索页面搜索
打开黑盒的方法
一个重要的踪迹工具: 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
和GUI的窗口管理很类似
C-Z
+ bg
&
指定后台运行jobs
fg
kill
kill -9 进程号
强行关闭ps aux
, top
,
htop
Linux上的程序在运行时默认打开了3个文件,
通过文件描述符
来编号:
可通过lsof -p 进程号
来查看打开的文件
向文件追加输出
管道 = 一个用于连接程序间输入输出的缓冲区
+-------+ stdout +------+ stdin +-------+
| prog1 | --------> | pipe | -------> | prog2 |
+-------+ +------+ +-------+
例:
青春版直播时钟
watch -t -n 1 "echo -n '一生一芯v24.07 | 周四 8:30~10:55 | '; \
date; echo '课程主页 https://ysyx.oscc.cc/docs/'"
无人值守重试操作
把命令写到一个文件里面
统计工具的类型分布, 并输出前10种类型
echo $PATH | tr : '\n' | xargs -I{} find {} -maxdepth 1 -type f -executable | \
xargs file -b -e elf | sort | uniq -c | sort -nr | head -n 10
结果: 大部分是可执行文件(ELF), 小部分是脚本
1819 ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV)
227 POSIX shell script, ASCII text executable
157 Python script, ASCII text executable
126 Perl script text executable
63 Bourne-Again shell script, ASCII text executable
23 awk or perl script, ASCII text
16 Ruby script, ASCII text executable
15 C source, ASCII text
13 POSIX shell script, Unicode text, UTF-8 text executable
13 ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux)
if
, for
, while
,
case
…等控制流man bash
一个例子
main()
函数的参数getopt()
库函数识别并处理参数fopen()
打开文件fscanf()/fread()
从标准输入读取fprintf()/fwrite()
将结果写入到标准输出main()
函数的返回值 = 命令的返回值
xxx
命令好像是做yyy
的…准确地说: 卸载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文件
Linux 打开pdf
->
得知可用evince
打开apt-get install evince
-> evince a.pdf
-> 解决例2: 想给终端分屏
Linux 分屏
-> 得知有tmux
分屏工具apt-get install tmux
-> 不会用tmux 教程
->
阅读教程学习tmux
的使用man tmux
-> 解决
RTFM + STFW能帮你一辈子
搜索引擎 | 百科 | 问答网站 | |
---|---|---|---|
提高 效率 |
www.google.com | en.wikipedia.org | stackoverflow.com |
浪费 生命 |
随着问题技术含量提高, 百度搜索结果越来越不靠谱
正确做法
强烈不建议使用中文关键字/安装中文系统 - 否则你会错过很多
大模型本质上是个概率模型, 需要鉴别信息的真伪
过度依赖大模型, 误以为自己具备了独立解决问题的能力
有大佬指导我, 我就能学得很好
本质上是一样的
一个残酷的事实: 大模型的到来对大家的学习提出了更高的要求
一种自我检查的方式:
对于未知, 人都有恐惧和懒惰的惯性
对于短期负收益的事情, 人都会聪明地选择逃避
对于未知, 人都有恐惧和懒惰的惯性
对于短期负收益的事情, 人都会聪明地选择逃避
学习使用Linux是一个成本低, 成功率高的锻炼机会
学校的大部分实验课都会安排助教手把手装系统/配环境
在我们看来, 装系统/配环境并不是无关的事情
我不做/不理解这个也行
的侥幸带着这种信念做实验, 你会收获很多
使用工具 = 编程
编程
学习工具首先需要端正心态 - 我真的想提高效率
短时间的投入是负收益, 但这些技能会让你终身受益