1. Shell
Bash (Bourne-Again SHell) 算是一个比较通用的 Shell 了
Gnome 的 gnome-terminal 、 KDE 的 Konsole 、 我正在用的 kitty 都是 Terminal Emulator ,里面默认运行的就是 Shell ,比如:
我使用的是 zsh
2. Wildcard
| 模式 | 匹配对象 |
|---|
* | 所有字符串 |
foo* | 以 foo 开头的字符串 |
foo*.txt | 以 foo 开头,以 .txt 结尾的字符串 |
foo??? | foo 后接三个字符的字符串 |
[abc]* | 以 abc 其中一个字符开头的字符串 |
foo.[0-9][0-9][0-9] | 以 foo. 开头,后接三个数字的字符串 |
[[:upper:]]* | 以一个大写字母开头的字符串 |
[![:digit:]]* | 开头一个字符不是数字的字符串 |
*[[:lower:]123] | 以小写字母及 123 其中的一个字符结尾的字符串 |
Wildcard 总是会以有序的方式展开
3. Command
一些实用工具:
type: built-in command ,告诉你 Shell 如何解释一个 command (主要查找类型)which: built-in command ,告诉你 Shell 在哪找到了你输入的 command (主要查找路径)man: 来自 man-db ,一个 man page 阅读器apropos: 来自 man-db ,搜索相关的 man pagewhatis: 来自 man-db , apropos 的简化版,在 man pages 里搜索简要描述info: 来自 texinfo , GNU Document 工具,很难用
man 章节号的约定:
- 用户命令
- 内核的系统调用的 API
- C 库的 API
- 设备、驱动之类的特殊文件
- 文件格式
- 游戏/娱乐
- 其他
- 系统管理命令
4. I/O Redirection
Shell 的一个强大之处
4.1. stdout&stderr
stdout -> file (trunc):
stdout -> file (app):
stderr -> file (trunc):
stdout&stderr -> file (trunc):
> file 和 2>&1 的解析顺序是: > file 先把 fd 1 重定向到 file , 2>&1 再把 fd 2 重定向到 fd 1 指向的 file 。如果先 2>&1 再 > file 会导致: 2>&1 先把 fd 2 重定向到 fd 1 指向的 stdout , > file 再把 fd 1 重定向到 file
ignore stderr:
4.2. stdin
file -> stdin:
5. Pipeline
Shell 的又一大杀器
command1’s stdout -> command2’s stdin:
command’s stdout -> stdout&file:
6. 展开
执行后会输出所有文件名,因为 Shell 在执行前会把 * 展开,然后交给 echo
6.1. *
1 2 3 4 5
| echo Do* echo *jpg echo [[:upper:]]* echo /usr/*/share echo *
|
* 不会展开隐藏文件
6.2. ~
6.3. {}
1 2 3 4 5 6 7
| rm photo{1,2,3,4} rm photo{1..4}
rm photo{4..1}
rm photo{a{1,2},b{3,4}}
|
6.4. $
6.5. $() & ``
1 2
| ls -hl $(which ls) ls -hl `which ls`
|
6.6. $(())
1 2
| echo $(( (2 + 2) * 2 / 2 )) echo $(( 2 ** 2 % 2 ))
|
6.7. ""
1 2
| echo "foo bar" echo "$(cal)"
|
6.8. ''
一些我忘记了的指令选项
ls
| 选项 | 作用 |
|---|
-d, --directory | 只列出这个目录,而不是目录里的内容 |
-F, --classify | 在每项后面加一个指示符,比如 * 表示可执行、 / 表示目录、 @ 表示软链接 |
-r, --reverse | 反向排序 |
-S | 按照文件大小排序 |
-A | 显示所有文件,与 -a 不同点在于这个不显示 . 和 .. |
cp
| 选项 | 作用 |
|---|
-a, --archive | 等同于 -dr --preserve=ALL |
-i, --interactive | 覆盖时询问(默认直接覆盖) |
-u, --update | 不覆盖(跳过)已存在的文件 |
-v, --verbose | 显示实际操作信息 |
mv
| 选项 | 作用 |
|---|
-i, --interactive | 覆盖时询问(默认直接覆盖) |
-u, --update | 不覆盖(跳过)已存在的文件 |
-v, --verbose | 显示实际操作信息 |
cat
创建临时文件
清空文件内容