容易混淆的问题
| 容易混淆 | 区别 |
|---|---|
$SHELL / $0 | 登录 Shell vs 当前进程;看真实进程用 ps -p $$ |
$TERM / 终端能力 | 只是名字,能力在 terminfo;名字错会乱码 |
| 终端 / Shell | 设备 vs 解释命令的进程 |
Ctrl-C / Shell | 信号由终端驱动发给前台进程组,不是 Shell 亲手发 |
if / [ | [ 是命令,两侧要空格;[[ ]] 是语法 |
$? / $! | 上一条命令的返回码 vs 最后一个后台 PID |
./script.sh / script.sh | 指定路径 vs 去 $PATH 里找 |
2>&1 的位置 | 放在 > 后才是“都进文件” |
| 无 tty / 有 tty | 脚本、CI、ssh host cmd 没有 tty,交互程序会失败 |
两个补充
终端里跑非 Shell 程序。 vim、python、less 都是普通进程,只是把终端切到 raw 模式,自己处理按键,退出时恢复。
返回码与管道。 管道默认只返回最后一段的状态,前面失败看不出来;用 pipefail 或 PIPESTATUS。