跳到正文

终端与 Shell ​

终端负责显示和输入,Shell 负责解释命令。两者经常被混为一谈,但一个是设备,一个是进程。

分工 ​

终端Shell
角色显示字符、接收按键解释命令、启动进程
例子iTerm2、Alacritty、Ghosttybash、zsh、fish
边界窗口关掉就没了会话里可以有很多个

分清这一点,后面两条线就不会混:TTY 的历史属于终端,路径查找和进程启动属于 Shell。

从 TTY 到模拟器 ​

  • ASR-33 电传打字机,Teletype 缩写成 TTY
  • tty 打印当前终端设备路径
  • VT100 用控制序列移动光标、改变颜色
  • 终端模拟器解释同一套 ANSI 序列
bash
tty
echo $TERM
tput colors

$TERM 只是能力名,不是能力本身。terminfo 数据库描述它支持哪些序列,名字写错时程序要么不敢用颜色,要么输出乱码。

Shell 的循环 ​

  1. 打印提示符,通常由 $PS1 决定
  2. 读入一行
  3. 切词、展开
  4. 沿 $PATH 查找程序
  5. fork + exec,父进程 wait
  6. 记录返回码,回到 1

argv ​

echo hello 交给程序的是 ["echo", "hello"]。Shell 只负责切词,hello 是什么意思由程序解释。

变量作用域含义
$0脚本 / Shell程序名
$1…$9脚本前九个参数
$#脚本参数个数
$@脚本全部参数

这些变量只在脚本或函数里有实际内容;交互式 Shell 里通常为空。

不同 Shell ​

Shell特点
bash默认选择,POSIX 的超集
zsh补全、主题、插件更丰富
fish语法更友好,不兼容 bash
sh最小公共集,脚本可移植

echo $SHELL 显示登录 Shell,ps -p $$ 才是当前进程。改默认 Shell 用 chsh -s /bin/zsh,重新登录后生效。