记录课后习题的解决方案。
- 所用操作系统是
Unubtu 22.04
,shell 环境是普通的bash
shell。
- shell 会从环境变量
$PATH
中搜索执行程序的路径(基于程序的名称搜索) which
用于确定某个程序名代表的是哪个具体的程序- 为进入某个文件夹,需要具备该文件夹以及其父文件夹的“搜索”权限(以“可执行” x 权限表示)。
- shellbang:
#!
后跟解释器绝对路径
2. shell 工具与脚本
ls -a # 不忽略以 . 开头的项(linux 中 . 开头的项会被隐藏)
ls -h -l -s # -l 使用长列表格式,-s 打印文件大小,-h 指示打印大小时用 234M、1K 这样的格式
ls -t # 以时间顺序排序所列出的信息,默认是字典序
ls --color=always # 着色输出,默认就是这个配置
以下都针对 bash shell 而言
- 为变量赋值:
foo=bar
- 访问变量值:
$foo
注意
foo = bar
(使用空格隔开)无法正确工作。因为解释器会调用程序foo
并将=
和bar
作为参数。在 shell 脚本中使用空格会起到分割参数的作用,有时可能会造成混淆,请务必多加检查。
-
$0
- 脚本名 -
$1
到$9
- 脚本的参数。$1
是第一个参数,依此类推。 -
$@
- 所有参数 -
$#
- 参数个数 -
$?
- 前一个命令的返回值 -
$$
- 当前脚本的进程识别码 -
!!
- 完整的上一条命令,包括参数。常见应用:当你因为权限不足执行命令失败时,可以使用sudo !!
再尝试一次。 -
$_
- 上一条命令的最后一个参数。如果你正在使用的是交互式 shell,你可以通过按下 Esc 之后键入 . 来获取这个值。 -
命令返回 0 表示正常执行,返回非 0 表示有错误发生。
-
true
程序的返回码永远是 0,false
程序的返回码永远是 1。 -
命令替换(command substitution):以变量的形式获取一个命令的输出。如
$( CMD )
会被替换为CMD
命令的输出 -
进程替换(process substitution),
<( CMD )
会执行CMD
并将结果输出到一个临时文件中,并将<( CMD )
替换成临时文件名。这在我们希望返回值通过文件而不是 STDIN 传递时很有用。例如,diff <(ls foo) <(ls bar)
会显示文件夹 foo 和 bar 中文件的区别。 -
shell 通配(globbing):基于文件扩展名展开表达式
-
花括号
{}
:当你有一系列的指令,其中包含一段公共子串时,可以用花括号来自动展开这些命令。这在批量移动或转换文件时非常方便。
convert image.{png,jpg}
# 会展开为
convert image.png image.jpg
find
命令:递归地搜索符合条件的文件
# 查找所有名称为src的文件夹
find . -name src -type d
# 查找所有文件夹路径中包含test的python文件
find . -path '*/test/*.py' -type f
# 查找前一天修改的所有文件
find . -mtime -1
# 查找所有大小在500k至10M的tar.gz文件
find . -size +500k -size -10M -name '*.tar.gz'
除了列出所寻找的文件之外,find 还能对所有查找到的文件进行操作,这能极大地简化一些单调的任务。
# 删除全部扩展名为.tmp 的文件
find . -name '*.tmp' -exec rm {} \;
# 查找全部的 PNG 文件并将其转换为 JPG
find . -name '*.png' -exec convert {} {}.jpg \;
- grep 命令:对输入文本进行匹配
grep 有很多选项:
-C
:获取查找结果的上下文(Context);-v
:对结果进行反选(Invert)即输出不匹配的结果。
grep -C 5
:输出匹配结果前后五行。
-
-R
:递归地进入子目录并搜索所有的文本文件。 -
Ctrl+R
对命令历史记录进行回溯搜索
:e {文件名}
:打开要编辑的文件:help {标题}
:打开帮助文档,比如:help :w
打开:w
命令的帮助文档。~
:改变字符大小写da'
删除一个单引号字符串,包括周围的单引号- 编辑
~/.vimrc
配置文件来自定义 vim - 8.0 后的 vim 有内置的插件管理器,为了扩展 vim 只需创建一个
~/.vim/pack/vendor/start
文件夹并将插件放入其中。 :s
:替换命令。:s /test/Test/g
在整个文件中将 test 全局替换成 Test:sp
/:vsp
:分割窗口
sed
:基于ed
的流编辑器.
:匹配除换行符之外的任意单个字符- 在
*
或+
后跟一个?
可使表达式变成非贪婪模式。(sed 不支持) - sed 的 -E 选项可启用扩展的正则表达式
- sed 的替换命令:s/REGEX/SUBSTITUTION/
- 被圆括号内的正则表达式匹配到的文本都会被存入一系列以编号区分的捕获组中。捕获组的内容可以在替换字符串时使用(
sed -E 's/REGEX/\1'
)。可通过\1
引用第一个捕获组的内容。 sort
:排序输入数据uniq -c
:将连续出现的行折叠为一行并用出现次数作为前缀sort -n
:按数字顺序排序输入(默认为 ASCII)
6. 版本控制-Git
一个版本对应一次提交,所以可视化版本历史就是可视化提交(commit)历史。
通过 git log --graph --all --oneline --decorate
可视化提交历史(以图形方式展示提交历史和分支结构。)。
- --all:显示所有分支的提交历史,包括远程分支和分离头指针。
- --graph:以图形方式显示提交历史和分支结构。
- --oneline:以一行显示每个提交的简化信息。
- --decorate:显示每个提交的引用,包括分支、标签等
可以通过 git log
和 git blame
来做,采用 log 做法的命令是:git log -1 README.md
- -<n>:只显示最近的 n 次提交
最近的做法是利用 git filter-repo
这款工具
-
https://debugtalk.com/post/clean-sensitive-data-from-git-history-commits/
-
[gitignore 与 core_exlucdesfile] (https://git-scm.com/docs/gitignore/zh_HANS-CN)