命令行基础
命令行操作基础:文件系统导航、进程管理、网络工具与Shell脚本入门。
1. Shell 与终端
1.1 Shell 概述
Shell 是操作系统的命令解释器,是用户与内核之间的接口。它接收用户输入的命令,将其翻译为系统调用,并将结果返回给用户。
| Shell | 全称 | 特点 |
|---|---|---|
| sh | Bourne Shell | Unix 最初 Shell |
| bash | Bourne Again Shell | Linux 默认,最广泛使用 |
| zsh | Z Shell | macOS 默认,功能强大 |
| fish | Friendly Interactive Shell | 用户友好,自动建议 |
| PowerShell | — | Windows 默认,面向对象 |
1.2 终端模拟器
终端模拟器是运行 Shell 的图形界面程序:
| 终端 | 平台 | 特点 |
|---|---|---|
| Windows Terminal | Windows | 多标签、GPU 加速 |
| iTerm2 | macOS | 分屏、热键窗口 |
| Alacritty | 跨平台 | GPU 加速、极简 |
| Kitty | 跨平台 | GPU 加速、图片显示 |
| WezTerm | 跨平台 | Lua 配置、多路复用 |
1.3 Shell 配置文件
# bash 配置文件加载顺序
/etc/profile # 系统级,登录时加载
~/.bash_profile # 用户级,登录时加载
~/.bashrc # 用户级,每次打开新 Shell 加载
# zsh 配置文件加载顺序
~/.zshenv # 所有 zsh 实例加载
~/.zshrc # 交互式 Shell 加载
~/.zlogin # 登录 Shell 加载
2. 文件系统操作
2.1 目录导航
pwd # 显示当前工作目录
cd /home/user/projects # 切换到绝对路径
cd ../.. # 上移两级目录
cd - # 返回上一个目录
cd ~ # 切换到主目录
2.2 文件与目录管理
# 创建
mkdir project # 创建目录
mkdir -p a/b/c # 递归创建多级目录
touch file.txt # 创建空文件
# 复制
cp file.txt backup.txt # 复制文件
cp -r src/ dest/ # 递归复制目录
# 移动与重命名
mv old.txt new.txt # 重命名
mv file.txt ../ # 移动到上级目录
# 删除
rm file.txt # 删除文件(不可恢复!)
rm -r directory/ # 递归删除目录
rm -rf directory/ # 强制递归删除(危险!)
# 查找
find . -name "*.js" # 按名称查找
find . -type f -mtime -7 # 查找7天内修改的文件
2.3 文件查看与搜索
# 查看文件
cat file.txt # 显示全部内容
less file.txt # 分页查看(推荐)
head -n 20 file.txt # 显示前20行
tail -n 20 file.txt # 显示后20行
tail -f log.txt # 实时追踪文件末尾
# 搜索
grep "error" log.txt # 搜索包含 error 的行
grep -r "TODO" src/ # 递归搜索目录
grep -i "warning" log.txt # 忽略大小写
grep -n "function" app.js # 显示行号
2.4 权限管理
# 查看权限
ls -la
# -rwxr-xr-x 1 user group 4096 Jan 1 12:00 script.sh
# └┬┘└┬┘└┬┘
# │ │ └── 其他用户: r-x (读+执行)
# │ └────── 组用户: r-x (读+执行)
# └────────── 所有者: rwx (读+写+执行)
# 修改权限
chmod +x script.sh # 添加执行权限
chmod 755 script.sh # 数字方式设置权限
chmod -R 644 directory/ # 递归设置目录权限
# 修改所有者
chown user:group file # 修改文件所有者和组
2.5 文件系统层次标准(FHS)
/ 根目录
├── bin/ 基本用户命令
├── sbin/ 系统管理命令
├── etc/ 系统配置文件
├── home/ 用户主目录
├── var/ 可变数据(日志、缓存)
├── tmp/ 临时文件
├── usr/ 用户程序
│ ├── bin/ 用户命令
│ ├── lib/ 库文件
│ └── local/ 本地安装的程序
├── opt/ 第三方软件
└── dev/ 设备文件
3. 进程管理
3.1 进程查看
ps aux # 查看所有进程
ps -ef # 另一种格式
top # 实时进程监控
htop # 增强版 top(推荐)
pgrep -f "node" # 按名称查找进程 PID
3.2 进程控制
# 前台/后台
command & # 后台运行
Ctrl+Z # 暂停当前进程
bg # 将暂停的进程放到后台
fg # 将后台进程调到前台
jobs # 查看后台任务
# 终止进程
kill PID # 发送 SIGTERM(优雅终止)
kill -9 PID # 发送 SIGKILL(强制终止)
killall node # 按名称终止所有匹配进程
pkill -f "webpack" # 按命令行模式终止
3.3 信号系统
| 信号 | 编号 | 含义 | 用途 |
|---|---|---|---|
| SIGHUP | 1 | 挂断 | 终端关闭时通知进程 |
| SIGINT | 2 | 中断 | Ctrl+C 发送 |
| SIGQUIT | 3 | 退出 | Ctrl+\ 发送,生成核心转储 |
| SIGTERM | 15 | 终止 | 默认 kill 信号,可被捕获 |
| SIGKILL | 9 | 杀死 | 强制终止,不可被捕获 |
| SIGSTOP | 19 | 停止 | 不可被捕获,暂停进程 |
| SIGCONT | 18 | 继续 | 恢复暂停的进程 |
3.4 守护进程与服务
# systemd 服务管理
systemctl start nginx # 启动服务
systemctl stop nginx # 停止服务
systemctl restart nginx # 重启服务
systemctl status nginx # 查看状态
systemctl enable nginx # 开机自启
systemctl disable nginx # 取消自启
# 查看服务日志
journalctl -u nginx -f # 实时查看 nginx 日志
4. 网络工具
4.1 连接测试
ping google.com # 测试网络连通性
ping -c 4 google.com # 发送4个包后停止
traceroute google.com # 跟踪路由路径
mtr google.com # 持续跟踪路由(推荐)
4.2 DNS 查询
nslookup google.com # DNS 查询
dig google.com # 详细 DNS 查询
dig +short google.com # 只显示 IP 地址
host google.com # 简洁 DNS 查询
4.3 端口与连接
# 查看端口占用
netstat -tlnp # 查看所有监听端口
ss -tlnp # 更快的替代方案
lsof -i :8080 # 查看占用 8080 端口的进程
# 网络连接测试
curl http://example.com # HTTP 请求
curl -I https://example.com # 只看响应头
wget https://example.com/file.zip # 下载文件
nc -zv localhost 3306 # 测试端口连通性
4.4 防火墙
# ufw(Ubuntu 防火墙)
ufw status # 查看状态
ufw allow 80/tcp # 允许 80 端口
ufw allow 443/tcp # 允许 443 端口
ufw deny 3306 # 拒绝 3306 端口
ufw enable # 启用防火墙
5. 管道与重定向
5.1 重定向
# 输出重定向
echo "hello" > file.txt # 覆盖写入
echo "world" >> file.txt # 追加写入
# 输入重定向
sort < names.txt # 从文件读取输入
# 错误重定向
command 2> error.log # 错误输出到文件
command 2>&1 # 错误合并到标准输出
command &> all.log # 所有输出到文件
5.2 管道
管道将前一个命令的标准输出作为后一个命令的标准输入:
# 组合使用
cat access.log | grep "404" | wc -l # 统计404错误数
ps aux | grep node | grep -v grep # 查找node进程
find . -name "*.js" | xargs wc -l # 统计JS文件行数
history | sort | uniq -c | sort -rn | head # 最常用命令
5.3 文本处理三剑客
# grep - 文本搜索
grep -E "error|warning" log.txt # 正则搜索
# sed - 流编辑器
sed 's/old/new/g' file.txt # 替换文本
sed -n '10,20p' file.txt # 打印10-20行
# awk - 文本分析
awk '{print $1, $3}' data.txt # 打印第1、3列
awk -F: '{print $1}' /etc/passwd # 指定分隔符
awk '$3 > 100 {print $0}' data.txt # 条件过滤
6. Shell 脚本入门
6.1 基本结构
#!/bin/bash
# 这是一个 Shell 脚本
# 变量
NAME="World"
echo "Hello, $NAME!"
# 条件判断
if [ -f "package.json" ]; then
echo "Found package.json"
npm install
else
echo "No package.json found"
fi
# 循环
for file in *.js; do
echo "Processing: $file"
done
# 函数
greet() {
local name=$1
echo "Hello, $name!"
}
greet "Developer"
6.2 实用脚本示例
#!/bin/bash
# 自动化项目部署脚本
set -e # 遇到错误立即退出
PROJECT_DIR="/var/www/myapp"
BRANCH="main"
echo "=== Deploying $BRANCH ==="
cd "$PROJECT_DIR"
git pull origin "$BRANCH"
npm install --production
npm run build
pm2 restart myapp
echo "=== Deploy complete ==="