Shell 学习笔记 0x00

Shell 学习笔记 0x00

RayAlto OP

1. Shell

Bash (Bourne-Again SHell) 算是一个比较通用的 Shell 了

Gnome 的 gnome-terminal 、 KDE 的 Konsole 、 我正在用的 kitty 都是 Terminal Emulator ,里面默认运行的就是 Shell ,比如:

1
2
$ echo $SHELL
/bin/zsh

我使用的是 zsh

2. Wildcard

模式匹配对象
*所有字符串
foo*foo 开头的字符串
foo*.txtfoo 开头,以 .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 page
  • whatis: 来自 man-db , apropos 的简化版,在 man pages 里搜索简要描述
  • info: 来自 texinfo , GNU Document 工具,很难用

man 章节号的约定:

  1. 用户命令
  2. 内核的系统调用的 API
  3. C 库的 API
  4. 设备、驱动之类的特殊文件
  5. 文件格式
  6. 游戏/娱乐
  7. 其他
  8. 系统管理命令

4. I/O Redirection

Shell 的一个强大之处

4.1. stdout&stderr

stdout -> file (trunc):

1
command > output.txt

stdout -> file (app):

1
command >> output.txt

stderr -> file (trunc):

1
command 2> err.txt

stdout&stderr -> file (trunc):

1
command > file 2>&1

> file2>&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

1
command &> file # 一种更加精简且合理的写法

ignore stderr:

1
command 2> /dev/null

4.2. stdin

file -> stdin:

1
command < file

5. Pipeline

Shell 的又一大杀器

command1’s stdout -> command2’s stdin:

1
command1 | command2

command’s stdout -> stdout&file:

1
command | tee file

6. 展开

1
echo *

执行后会输出所有文件名,因为 Shell 在执行前会把 * 展开,然后交给 echo

6.1. *

1
2
3
4
5
echo Do*
echo *jpg
echo [[:upper:]]*
echo /usr/*/share
echo *

* 不会展开隐藏文件

6.2. ~

1
2
echo ~
cd ~user

6.3. {}

1
2
3
4
5
6
7
rm photo{1,2,3,4}
rm photo{1..4}
# rm photo1 photo2 photo3 photo4
rm photo{4..1}
# rm photo4 photo3 photo2 photo1
rm photo{a{1,2},b{3,4}}
# rm photoa1 photoa2 photob3 photob4

6.4. $

1
echo $SHELL

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. ''

1
echo '$(cal)'

一些我忘记了的指令选项

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

创建临时文件

1
cat > file

清空文件内容

1
cat /dev/null > file