Mind and Hand Help

Shell 速查表

1. I/O 重定向

符号

含义

示例

说明

>

重定向 stdout ,覆盖写

echo hello > out.txt

文件不存在则创建,存在则清空后写入

>>

重定向 stdout ,追加写

echo hello >> out.txt

追加到文件末尾

<

重定向 stdin

wc -l < file.txt

将文件内容作为输入

1>

重定向 stdout

echo hello 1> out.txt

1 就是标准输出,通常可省略

2>

重定向 stderr

ls nofile 2> err.txt

错误输出写入文件

2>>

追加 stderr

cmd 2>> err.txt

错误输出追加到文件

&>

重定向 stdoutstderr

cmd &> all.log

Bash 用法,兼容性不如 > file 2>&1

2>&1

stderr 指向 stdout 当前目标

cmd > out.log 2>&1

顺序非常重要

1>&2

stdout 指向 stderr 当前目标

echo "err" 1>&2

常用于输出错误信息

>/dev/null

丢弃标准输出

cmd > /dev/null

黑洞设备

2>/dev/null

丢弃错误输出

cmd 2> /dev/null

忽略报错

>/dev/null 2>&1

丢弃所有输出

cmd >/dev/null 2>&1

静默执行

2. 管道与流程控制

符号

含义

示例

说明

|

管道,将前一个命令的 stdout 传给后一个命令的 stdin

ps aux \| grep nginx

默认只传 stdout

| &

stdoutstderr 一起传入管道

cmd \|& grep error

Bash 中等价于 cmd 2>&1 \| grep error

&&

前一个命令成功才执行后一个

make && make install

依赖退出码 0

| |

前一个命令失败才执行后一个

mkdir data || echo fail

常用于失败兜底

;

顺序执行,不管前一个成功还是失败

cmd1; cmd2

单纯串联

&

后台执行

sleep 60 &

当前 shell 不阻塞

!

取反退出码

if ! grep -q x a.txt; then ... fi

成功变失败,失败变成功

3. 分组与作用域

符号

含义

示例

说明

()

在子 Shell 中执行

(cd /tmp && ls)

内部环境变化不会影响外部

{}

在当前 Shell 中分组执行

{ cd /tmp; ls; }

会影响当前 shell 环境

exec

修改当前 Shell 的文件描述符或替换当前进程

exec >app.log 2>&1

后续命令输出也会被重定向

4. 变量、展开与替换

符号

含义

示例

说明

$var

变量展开

echo $HOME

取变量值

${var}

明确变量边界

echo ${name}_test

推荐用于拼接

${var:-default}

变量为空或未定义时使用默认值

echo ${PORT:-8080}

常用于参数兜底

${var:=default}

为空或未定义时赋默认值

: ${PORT:=8080}

会写回变量

${var:+alt}

变量已定义且非空时返回替代值

echo ${DEBUG:+enabled}

条件展开

${#var}

取变量长度

echo ${#name}

字符串长度

$(...)

命令替换

now=$(date +%F)

推荐,支持嵌套

`...`

命令替换(旧写法)

now=`date +%F`

不推荐,嵌套难看

$((...))

算术扩展

echo $((1 + 2 * 3))

仅整数运算

5. 通配与匹配

符号

含义

示例

说明

*

匹配任意长度字符

ls *.log

Shell 通配,不是正则

?

匹配单个字符

ls a?.txt

匹配 1 个字符

[]

匹配字符集合

ls file[123].txt

匹配指定字符之一

[a-z]

匹配范围

ls [a-z]*.txt

也是 shell glob

6. 引号与转义

符号

含义

示例

说明

"..."

双引号,保留空格,允许变量展开

echo "$HOME"

最常用

'...'

单引号,原样保留,不展开变量

echo '$HOME'

内容完全字面量

\

转义符

echo \$HOME

让特殊字符失去特殊含义

\ + 换行

续行

echo hello \
world

将一行命令拆成多行

7. Here 文本输入

符号

含义

示例

说明

<<EOF

Here Document,多行文本输入

cat <<EOF

常用于生成配置文件

<<'EOF'

Here Document,禁止变量展开

cat <<'EOF'

保留原始内容

<<<

Here String,单字符串输入

grep hi <<< "hi world"

echo ... \| cmd 更直接

8. 注释与特殊用途

符号

含义

示例

说明

#

注释

# this is comment

引号内不算注释

:

空命令(no-op)

: > file.txt

常用于清空文件、占位

--

参数结束标记

rm -- -file

防止文件名被当成选项

9. 文件描述符相关

写法

含义

示例

说明

0

stdin

0< input.txt

标准输入

1

stdout

1> out.txt

标准输出

2

stderr

2> err.txt

标准错误

3>&1

将 FD 3 指向当前 stdout

exec 3>&1

常用于备份输出

1>&3

stdout 恢复到 FD 3

exec 1>&3

配合备份使用

3>&-

关闭 FD 3

exec 3>&-

释放自定义 FD

10. 常见组合写法

只在成功时继续

cmd1 && cmd2

失败时输出错误

cmd >/dev/null 2>&1 &

后台运行并记录日志

nohup cmd > app.log 2>&1 &

错误也进管道

cmd 2>&1 | grep error

统计文件行数

wc -l < file.txt

生成多行文件

cat > app.conf <<EOF port=8080 host=127.0.0.1 EOF

备份并恢复 stdout/stderr

exec 3>&1 4>&2 exec > app.log 2>&1 echo "write to log" exec 1>&3 2>&4 exec 3>&- 4>&-

11. 易错点速记

2>&1 顺序不能乱

正确:

cmd > out.log 2>&1

错误语义不同:

cmd 2>&1 > out.log

| 默认不传 stderr

cmd1 | cmd2

只传 stdout。

* 是 Shell 展开,不是正则

ls *.log

cmd & 不等于守护进程

python app.py &

只是后台运行,终端关闭后可能退出。

(){} 不同

(cd /tmp) { cd /tmp; }

前者不影响当前 shell,后者会影响。

12. 一行口诀

> 覆盖,>> 追加,< 输入, 2> 错误,2>&1 合流, | 管道,& 后台, && 成功继续,|| 失败继续,; 无脑继续, () 子 shell,{} 当前 shell, $() 命令替换,$(( )) 算术, " " 可展开,' ' 原样,\ 转义。

极简速查

符号

作用

>

覆盖重定向 stdout

>>

追加重定向 stdout

<

重定向 stdin

2>

重定向 stderr

2>&1

stderr 合并到 stdout

|

管道

| &

stdout + stderr 一起进管道

&

后台执行

&&

前一个成功才执行后一个

| |

前一个失败才执行后一个

;

顺序执行,不管成功失败

!

取反退出码

()

子 Shell 执行

{}

当前 Shell 分组

$(...)

命令替换

$((...))

算术扩展

*

任意字符通配

?

单字符通配

[]

字符集通配

"..."

保留空格,允许变量展开

'...'

原样保留,不展开

\

转义

<<EOF

Here Document

<<<

Here String

#

注释

11 June 2026