跳到正文

一条命令的旅程 ​

从回车到执行,Shell 按固定顺序处理一行命令。搞清顺序,引号和空格的怪行为都能解释。

展开顺序 ​

输入花括号与波浪号展开参数与命令替换切词文件名展开查找并执行
步骤例子结果
花括号展开{a,b}.txta.txt b.txt
波浪号展开~/bin/home/me/bin
参数替换$HOME/home/me
命令替换$(date)2026-11-06
切词$files按 IFS 拆成多个词
文件名展开*.pya.py b.py

引号 ​

写法变量展开切词保护典型用途
'...'否是字面量、正则
"..."是是带空格的变量
$'...'否是\n、\t 转义
\x否单字符转义特殊字符
bash
files="a b"
rm $files      # 两个参数
rm "$files"    # 一个参数

变量与替换 ​

  • $HOME 与 ${HOME} 等价,${HOME}dir 用来划边界
  • export 把变量放进环境,子进程才能继承
  • $(...) 去掉末尾换行,保留中间换行
  • 反引号是旧写法,不能嵌套

glob ​

模式匹配
*任意长度字符
?单个字符
[abc]字符集合
**递归目录,需 globstar
  • 默认不匹配隐藏文件,. 和 .. 不参与
  • 无匹配时 bash 保留原样,nullglob 变空,failglob 报错
  • 花括号展开在 glob 之前,不要求文件存在

查找与执行 ​

  1. 按 : 拆开 $PATH,从左到右找第一个同名可执行文件
  2. type -a 显示所有候选,command -v 是 POSIX 写法
  3. hash -r 清掉路径缓存
  4. 外部命令走 fork + exec + wait
  5. cd、export、umask 是内建,因为子进程改不了父进程
bash
type -a python
hash -r
set -x   # 打印展开后的命令

set -x 是验证展开顺序最快的方式,比在脑子里模拟可靠。