MIT Missing Semester 学习笔记
Last updated on November 23, 2023 8:17 PM
Shell
基本使用相关
提示符:USERNAME:~$
。当前工作目录为 ~
,即主目录 home。$
意味着当前不为 root。
shell 解析命令的时候以空格为分隔,第一个子段指向程序,之后的分别是程序的参数。
导航
/
为根目录(Linux 下),.
为当前目录,..
为父目录。
pwd
显示当前路径,ls
列出当前目录下的内容。
ls
的 -l
表示长列表模式。
1 |
|
d 表示是否为路径。
九个字母,三个一组,分别描述 owner,users 和 everyone 对其的权限。
rwx 分别是 read write 和 excute。
mv
移动,cp
复制,mkdir
新建文件夹。
man xxx
表示查看 xxx
的 manual。
重定向与管道初步
最简单的重定向就是 < inputfile
和 > outputfile
。
>> outputfile
是在文末追加。
|
可以管道。
1 |
|
管道是将前者的输出(可以理解为 stdout)
Shell Scripting
直接可以定义foo=bar
,但是不能有空格,注意空格是拿来分开参数的。
调用变量的时候用美元符号。
字符串单引号不会展开美元符号,双引号会展开为变量
bash 的函数参数:
1 |
|
Here $1
is the first argument to the script/function. Unlike other scripting languages, bash uses a variety of special variables to refer to arguments, error codes, and other relevant variables. Below is a list of some of them. A more comprehensive list can be found here.
-
$0
- Name of the script -
$1
to$9
- Arguments to the script.$1
is the first argument and so on. 其实就很类似于argv[1]
-
$@
- All the arguments 会展开为所有参数 -
$#
- Number of arguments -
$?
- 上一条命令的返回值true 的错误代码始终为 0,false 的错误代码始终为 1。
请注意,这里和一般的 true 和 false 是不一样的。
false || echo "Oops fail"
。 -
$$
- Process identification number (PID) for the current script -
!!
- 上一次命令. A common pattern is to execute a command only for it to fail due to missing permissions; 常用sudo !!
-
$_
- Last argument from the last command. If you are in an interactive shell, you can also quickly get this value by typingEsc
followed by.
orAlt+.
可以使用 ;
来分隔变量。
foo=$(pwd)
,echo "We are in $(pwd)"
。command substitution,用一个命令的输出作为一个变量。
process substitution:<(CMD)
会执行里面的命令,然后将输出放入一个临时文件,同时将 <()
替换成文件的名字。一个比较常见的会是 diff <(ls foo) <(ls bar)
,可以拿来比较 foo 和 bar 目录中的内容差异。
1 |
|
2>
是指向 STDERR
流的。使用 man test
可以查询那一堆堆比较运算符。
一些很抽象的展开:通配符,花括号:
1 |
|
Shebang:指导选择哪个脚本的解释器。
Some Shell Tools
查看手册:man
,但可能麻烦。实例:tldr
。
查找文件:
1 |
|
还有一个是 fd
,语法更好用一些。
locate
基于 db 索引,会快些,updatedb
更新索引。
查找文件内容:
grep
是最基本的。-C
查找上下文,如 grep -C 5
。ack
,ag
和 rg
是改进版本。
1 |
|