信息层级:【有据可查】= 附官方文档或可信来源链接;【社区共识】= 社区用户普遍经验,未经官方确认;【待考察/推测】= 推测或暂未能核实,请谨慎对待。
官方手册:GNU Bash Reference Manual;命令说明可用
man 命令名或命令 --help。【有据可查】
1. 为什么要会 Bash?
【社区共识】Linux 服务器(VPS 入门:连接、账号、防火墙与日常维护 VPS)、macOS 终端、WSL、Docker 容器、CI 流水线都离不开它。Agent 执行的大部分命令也是 Bash——看懂它,才能判断 Agent 申请执行的命令是否危险(AI 编程 Agent 怎么选:工具、权限与工作方式的"弹窗依赖判断力")。
2. 最常用命令
| 类别 | 命令 | 作用 |
|---|---|---|
| 导航 | pwd、cd 目录、ls -la |
当前位置、切换、列出(含隐藏文件) |
| 文件 | cp、mv、mkdir -p、touch、rm |
复制、移动、建目录、建文件、删除 |
| 查看 | cat、less、head -n 20、tail -f log |
查看文件、实时看日志 |
| 搜索 | grep -rn "关键词" .、find . -name "*.py" |
搜内容、搜文件名(也可用更快的 rg) |
| 权限 | chmod +x run.sh、chown |
改权限、改所有者 |
| 进程 | ps aux、top/htop、kill PID |
查看、结束进程 |
| 网络 | curl -I URL、ping、ss -tlnp |
请求、连通性、监听端口 |
| 磁盘 | df -h、du -sh * |
磁盘空间、目录大小 |
| 压缩 | tar -czf a.tar.gz dir/、tar -xzf a.tar.gz |
打包、解包 |
| 帮助 | man ls、ls --help |
查手册 |
3. 脚本语法速查
#!/usr/bin/env bash
set -euo pipefail # 出错即停、未定义变量报错、管道中任一失败即失败
name="world" # 赋值:等号两边不能有空格!
echo "Hello, ${name}" # 双引号内变量会展开;单引号不会
# 条件
if [[ -f "config.json" ]]; then
echo "配置存在"
elif [[ -d "config" ]]; then
echo "是目录"
else
echo "不存在"
fi
# 循环
for f in *.txt; do
echo "处理 $f"
done
# 函数
greet() {
local who="$1" # $1 是第一个参数
echo "Hi, $who"
}
greet "Alice"
# 命令替换与退出码
today=$(date +%F)
if grep -q "ERROR" app.log; then echo "有错误"; fi
echo "上一条命令退出码: $?"
| 符号 | 含义 |
|---|---|
> / >> |
覆盖写入 / 追加写入文件 |
2>&1 |
把错误输出合并到标准输出 |
| |
管道:前一个命令的输出作为后一个的输入 |
&& / || |
前一个成功才执行 / 失败才执行 |
$VAR / "$VAR" |
变量;加双引号防止空格拆分 |
~ |
家目录 |
* ? |
通配符 |
4. 危险命令识别表(审批 Agent 命令时必看)
| 命令模式 | 风险 | 层级 |
|---|---|---|
rm -rf /、rm -rf ~、rm -rf $VAR/(VAR 可能为空) |
删除整个系统或家目录 | 社区共识 |
chmod -R 777 |
所有人可读写执行,严重安全隐患 | 社区共识 |
curl ... | bash / | sh |
直接执行网络脚本(仅对可信官方源使用) | 社区共识 |
> 重要文件 |
清空文件 | 社区共识 |
dd if=... of=/dev/sdX |
覆盖整个磁盘 | 社区共识 |
git push --force、git reset --hard |
覆盖历史、丢弃改动 | 社区共识 |
sudo 开头的任何命令 |
以管理员权限运行 | 社区共识 |
读取 ~/.ssh、.env、*credentials* 并上传 |
凭据泄露 | 社区共识 |
5. 读懂报错
| 报错 | 含义 | 处理 |
|---|---|---|
command not found |
程序没装或不在 PATH | 安装它;which 命令 检查 |
No such file or directory |
路径不存在 | pwd 确认当前位置;检查拼写与大小写(Linux 区分大小写) |
Permission denied |
无权限 | 脚本需 chmod +x;文件属主不对;不要条件反射加 sudo |
syntax error near unexpected token |
语法错 | 常见:if 缺 then/fi、Windows 换行符 \r |
$'\r': command not found |
脚本是 Windows 换行(CRLF) | dos2unix script.sh 或在编辑器改为 LF |
bad substitution |
用 sh 运行了 Bash 语法 |
用 bash script.sh 运行 |
unbound variable |
set -u 下使用了未定义变量 |
给默认值 ${VAR:-默认} |
Address already in use |
端口被占用 | ss -tlnp 找到占用进程 |
Killed |
常被系统 OOM 杀掉(内存不足) | 查看 dmesg,减小内存占用 |
退出码:0 为成功,非 0 为失败;127 常表示命令未找到,126 表示无法执行(权限),130 表示被 Ctrl+C 中断。【有据可查:Bash 手册 Exit Status】
6. 本篇无法核实/需谨慎的点
- macOS 默认 shell 为 zsh,部分语法与 Bash 有差异;BSD 与 GNU 版命令参数也不同。
- 各发行版预装的工具(如
rg、htop)不同。
小白练习:把本文流程逐项走通
练习目标:在练习目录执行小脚本,分清输出与退出码。
上文已介绍概念、配置和操作示例。下面侧重第一次实际操作时的顺序、检查点和结果核对;需要查具体参数时回到对应小节。命令逐条输入,看到上一条的结果后再继续。
-
先确认当前窗口真的是 Bash,例如 Linux 终端、WSL 或 Git Bash;PowerShell 不是 Bash。
补充说明:需要 Bash 时在自己已有的 Linux、WSL 或 Git Bash 环境中练习。窗口名称、命令语言和实际工作目录需要分别确认。
-
运行 pwd 看位置,再新建一个练习目录并 cd 进入;运行 ls 检查范围。
补充说明:上文较长脚本包含多段语法;
config.json、config、app.log是示例文件名,不存在时分支和搜索结果会变化,不必先照抄整段运行。 -
用编辑器保存一个只输出问候的 hello.sh,采用 LF 换行,再用 bash hello.sh 运行。
补充说明:首次小脚本只写
echo "Hello, Bash!",保存为 UTF-8、LF 的hello.sh。bash hello.sh应输出Hello, Bash!,这种调用无需先给文件增加可执行权限。 -
脚本结束后立刻运行 echo $? 查看退出码;运行其他命令后读到的就不是刚才脚本的退出码了。
补充说明:成功的问候脚本应返回
0。上文在if grep ...; then ...; fi后读取的是复合命令状态,不一定是grep本身的状态;测试搜索结果要单独运行grep后立即读取,并区分未匹配与执行错误。 -
用带空格的文件名练习引号,先查看文件,再复制到新的练习文件名;本练习无需删除真实资料。
补充说明:例如文件名含空格时,读取可用
cat "practice notes.txt"。先在练习目录准备该文件,检查名字,再观察加引号前后的区别。 -
查看 Agent 请求的命令时依次识别执行目录、展开后的目标路径、是否覆盖文件和是否上传内容。
补充说明:危险命令表用于识别动作与审批,不是待执行的练习清单。
>会覆盖目标内容,>>会追加;是否写入和写入哪里都要看完整命令。
