命令行环境
参数与 flag
- 参数是纯字符串,含义由程序解释
$1…$9、$#、$@、$0"$@"的引号语义-a与--all等价- 短选项合并、顺序无关:
ls -la --终止选项解析- 可变参数:同一操作作用于多个文件
- glob 在程序启动前展开成参数
流与管道
- 管道中所有进程同时启动
- stdin、stdout、stderr 的分工
-作为 stdin 的文件名>、>>、<、2>、&>与/dev/null- fzf 过滤 stdin:
ls | fzf、history | fzf
变量与环境
foo=bar不能有空格'字面量与"展开- 命令替换
$(...)保留换行 - 进程替换
<(...)的临时文件 printenv、export、unset- 单命令环境:
TZ=Asia/Tokyo date - 环境变量大写命名只是约定
$HOME、$PATH的隐式作用source与.在当前 shell 执行- 子 shell 与变量作用域
返回码与条件
- 0 成功、非 0 失败
exit NUM与$?$?只保留上一条命令&&、||短路if cmd; then与while read- 返回码 0–255 截断
信号与作业控制
- 信号即软件中断
SIGINT、SIGQUIT、SIGTERMSIGSTOP、SIGTSTP、SIGHUPSIGCONT让暂停的进程继续SIGKILL不可捕获Ctrl-C、Ctrl-\、Ctrl-Z- 信号由终端发给前台进程组
kill -l、kill -TERM PIDkill %1、kill $!jobs、fg、bg、&pgrep、pkill -lfwait只等子进程kill -0探活nohup、disown- 关闭终端与
SIGHUP trap cleanup EXIT
远程机器
ssh user@hostssh host cmd的引号归属- 公钥认证与私钥
ssh-keygen -a 100 -t ed25519ssh-copy-id与authorized_keys~/.ssh/config的 Host 块与通配IdentityFile、Port、Userssh-agent与 passphrase- 密钥权限 600/700
known_hosts与首次连接scp、rsync与--partialrsync源路径的尾部/- 端口转发:
LocalForward、-N -f - mosh 的断线恢复
终端复用
- session、window、pane 三层
tmux new -s命名 sessiontmux ls与tmux a -t<C-b> d分离 session<C-b> c、<C-b> N、<C-b> w<C-b> %垂直分屏<C-b> "水平分屏- 方向键切换 pane、
<C-b> z放大 <C-b> [滚屏与复制- 远端会话替代
nohup
Shell 定制
- dotfile 与隐藏文件约定
- bash 启动文件:
.bashrc与.bash_profile export PATH="$PATH:..."PATH的重复项与顺序alias与函数alias ll、\ls、unaliashistory、Ctrl-R- fzf 接管历史搜索
- dotfiles 仓库与
ln -s curl | bash的风险- brew、apt、dnf、pacman
ripgrep与fdtldr、command-not-found.com- oh-my-zsh、prezto 与插件,按需安装
$PS1、补全、语法高亮- 终端模拟器:字体、配色、GPU 与
$TERM
AI 在命令行里
llm cmd生成命令- llm 接管道清洗文本
容易混淆的问题
source与./script.sh$?与$!kill %1与kill PIDCtrl-C与Ctrl-Znohup、disown与 tmuxssh host cmd的引号由哪端展开-是 stdin 还是文件名--是参数还是终止符alias与函数$@加不加引号- 信号是 shell 发的还是终端发的
- 关闭终端为何杀掉后台任务