什么是 Shell#
Shell 是用户与操作系统内核之间的接口程序。当你在终端中输入命令时,Shell 会解析你的输入并调用相应的程序执行。
为什么要学习 Shell#
| 场景 | 说明 |
|---|
| 自动化 | 编写脚本自动完成重复性任务 |
| 远程管理 | SSH 远程连接服务器时只能使用命令行 |
| 效率 | 熟练使用命令行比图形界面更快 |
| 编程基础 | 理解文件系统、进程管理等概念 |
常见的 Shell#
| Shell | 说明 |
|---|
| Bash | Bourne Again Shell,最常用的 Shell |
| Zsh | Z Shell,功能更强大,兼容 Bash |
| Fish | Friendly Interactive Shell,语法更简单 |
文件系统操作#
查看当前目录#
pwd
pwd -P # 显示物理路径(解析符号链接)
pwd 是 print working directory 的缩写,显示当前所在的目录路径。
列出目录内容#
ls
ls -l # 详细列表
ls -la # 显示所有文件(包括隐藏文件)
ls -lh # 显示文件大小(人类可读格式)
ls -la /home/edward # 指定目录
ls -la --sort=size # 按大小排序
ls -la --sort=time # 按时间排序
示例输出:
total 24
drwxr-xr-x 2 edward edward 4096 Jul 12 10:00 documents
-rw-r--r-- 1 edward edward 128 Jul 12 09:00 hello.txt
drwxr-xr-x 3 edward edward 4096 Jul 12 08:00 projects
切换目录#
cd /home/edward # 切换到绝对路径
cd documents # 切换到相对路径
cd .. # 返回上级目录
cd ../.. # 返回上两级目录
cd ~ # 切换到用户主目录
cd - # 返回上一次所在的目录
cd ~/projects # 快捷方式,用户主目录下的 projects
创建目录#
mkdir new_folder # 创建单个目录
mkdir -p projects/myapp # 创建嵌套目录(-p 参数自动创建父目录)
mkdir -m 755 secure_folder # 创建目录并设置权限
创建文件#
touch hello.txt # 创建空文件
touch -t 202401010000 file.txt # 创建文件并设置时间戳
echo "Hello World" > hello.txt # 创建文件并写入内容
printf "Name: %s\nAge: %d\n" "Tom" 25 > info.txt # 格式化输出
查看文件内容#
cat hello.txt # 显示文件全部内容
cat -n hello.txt # 显示行号
head -n 10 hello.txt # 显示前 10 行
tail -n 10 hello.txt # 显示后 10 行
tail -f log.txt # 实时显示文件末尾(用于查看日志)
tail -F log.txt # 实时显示,文件被替换后仍能追踪
less hello.txt # 分页查看文件内容(按 q 退出)
more hello.txt # 分页查看(空格键翻页)
复制与移动#
cp source.txt destination.txt # 复制文件
cp -r folder1 folder2 # 复制目录(-r 表示递归)
cp -i source.txt dest.txt # 交互式复制(覆盖前提示)
cp -a folder1 folder2 # 保留属性复制(归档模式)
cp -u source.txt dest.txt # 仅复制更新的文件
mv file.txt new_location/file.txt # 移动文件
mv old_name.txt new_name.txt # 重命名文件
mv -i file.txt dest.txt # 交互式移动
删除文件#
rm file.txt # 删除文件
rm -i file.txt # 交互式删除(删除前确认)
rm -r folder # 删除目录(-r 表示递归)
rm -rf folder # 强制删除目录(慎用!)
rm -rf -- folder # 删除以 - 开头的文件
警告:rm -rf 命令非常危险,会直接删除文件而不提示,误操作可能导致数据丢失!
文件权限#
权限表示法#
-rw-r--r-- 1 edward edward 128 Jul 12 09:00 hello.txt
| 位置 | 说明 |
|---|
- | 文件类型(- 普通文件,d 目录,l 符号链接) |
rw- | 所有者权限(读、写、无执行) |
r-- | 组权限(读、无写、无执行) |
r-- | 其他用户权限(读、无写、无执行) |
修改权限#
chmod +x script.sh # 添加执行权限
chmod -x script.sh # 移除执行权限
chmod 755 script.sh # 设置权限为 rwxr-xr-x
chmod 644 hello.txt # 设置权限为 rw-r--r--
chmod u+x script.sh # 只为所有者添加执行权限
chmod g+w file.txt # 只为组添加写权限
chmod o-r file.txt # 移除其他用户的读权限
chmod -R 755 folder/ # 递归修改目录权限
修改所有者#
chown edward file.txt # 修改所有者
chown edward:users file.txt # 修改所有者和组
chown -R edward folder/ # 递归修改目录所有者
chgrp users file.txt # 只修改组
数字权限说明:
| 数字 | 权限 | 说明 |
|---|
| 7 | rwx | 读、写、执行 |
| 6 | rw- | 读、写 |
| 5 | r-x | 读、执行 |
| 4 | r– | 只读 |
| 3 | -wx | 写、执行 |
| 2 | -w- | 只写 |
| 1 | –x | 只执行 |
| 0 | — | 无权限 |
管道与重定向#
管道(Pipe)#
管道符 | 用于将一个命令的输出作为另一个命令的输入:
ls -la | grep ".txt" # 列出所有 txt 文件
cat log.txt | grep "error" # 在日志中查找包含 error 的行
cat log.txt | grep "error" | wc -l # 统计 error 出现的次数
cat log.txt | grep -v "info" | head -20 # 排除 info 行,显示前 20 行
重定向#
echo "Hello" > file.txt # 覆盖写入文件
echo "World" >> file.txt # 追加写入文件
cat file.txt > output.txt # 将文件内容复制到另一个文件
command > /dev/null # 将输出丢弃(不显示)
command 2> error.log # 将错误输出重定向到文件
command &> log.txt # 将标准输出和错误输出都重定向到文件
command >> log.txt 2>&1 # 追加输出,错误也追加
输入重定向#
wc -l < file.txt # 统计文件行数(通过输入重定向)
cat > file.txt << EOF # 多行输入(Here Document)
第一行
第二行
第三行
EOF
Git 版本控制#
初始化仓库#
git init # 初始化本地仓库
git init --bare repo.git # 创建裸仓库(用于服务器)
git clone <repo-url> # 克隆远程仓库
git clone --depth 1 <repo-url> # 浅克隆(只获取最近一次提交)
git clone -b <branch> <repo-url> # 克隆指定分支
基础操作#
git add . # 将所有修改添加到暂存区
git add filename.txt # 添加指定文件
git add -p filename.txt # 交互式添加(逐块选择)
git commit -m "commit message" # 提交到本地仓库
git commit -am "message" # 跳过暂存,直接提交已跟踪文件
git commit --amend # 修改最后一次提交
git status # 查看工作区状态
git status -s # 简洁状态输出
git log # 查看提交历史
git log --oneline # 简洁的提交历史
git log --oneline -5 # 最近 5 次提交
git log --graph --oneline # 图形化显示提交历史
git log --all --oneline --graph # 显示所有分支
git diff # 查看未暂存的修改
git diff --staged # 查看已暂存的修改
git diff HEAD # 查看所有修改
分支管理#
git branch # 列出所有分支
git branch -v # 显示分支最后提交
git branch -a # 显示所有分支(包括远程)
git branch new-branch # 创建新分支
git switch new-branch # 切换到新分支(推荐,替代 git checkout)
git switch -c feature # 创建并切换到新分支(推荐,替代 git checkout -b)
git merge feature # 合并分支
git merge --no-ff feature # 强制创建合并提交
git branch -d feature # 删除分支
git branch -D feature # 强制删除分支(未合并时)
git branch -m old-name new-name # 重命名分支
远程操作#
git remote -v # 查看远程仓库
git remote add origin <url> # 添加远程仓库
git remote rename origin github # 重命名远程仓库
git remote remove origin # 删除远程仓库
git push -u origin main # 推送到远程仓库(第一次)
git push # 推送到默认远程分支
git push origin feature # 推送指定分支
git push -d origin feature # 删除远程分支
git pull origin main # 拉取远程更新并合并
git pull --rebase origin main # 拉取并变基
git fetch origin # 获取远程更新(不合并)
git fetch origin feature:feature # 获取远程分支到本地
git rebase origin/main # 将本地提交变基到远程
git reset --hard origin/main # 强制重置到远程状态
撤销操作#
git restore file.txt # 撤销工作区修改(推荐)
git restore --staged file.txt # 取消暂存(推荐)
git restore --source=HEAD~1 file.txt # 恢复到上一次提交的版本
git reset HEAD file.txt # 取消暂存(传统方式)
git reset --hard HEAD # 重置所有修改(慎用!)
git reset --hard HEAD~1 # 回退到上一次提交
git revert <commit-hash> # 撤销提交(创建新提交)
git revert HEAD # 撤销最后一次提交
git checkout <commit> -- file.txt # 从特定提交恢复文件
暂存操作#
git stash # 暂存工作区修改
git stash save "message" # 暂存并添加说明
git stash list # 查看暂存列表
git stash apply # 应用最近的暂存
git stash apply stash@{1} # 应用指定的暂存
git stash pop # 应用并删除暂存
git stash drop stash@{0} # 删除指定暂存
git stash clear # 清空所有暂存
变基与合并#
git rebase main # 在 main 分支基础上重新提交
git rebase -i HEAD~3 # 交互式变基(修改最近 3 次提交)
git cherry-pick <commit-hash> # 复制指定提交到当前分支
git cherry-pick --no-commit <commit-hash> # 复制但不提交
git merge-base main feature # 查找两个分支的共同祖先
git log main..feature # 查看 feature 上独有的提交
awk 文本处理#
基本语法#
awk '{print $1}' file.txt # 打印第一列
awk '{print $1, $3}' file.txt # 打印第一列和第三列
awk -F ':' '{print $1}' /etc/passwd # 使用冒号作为分隔符
awk -F '[,:]' '{print $1}' file.txt # 使用多个分隔符
内置变量#
| 变量 | 说明 |
|---|
$0 | 整行内容 |
$1-$NF | 第 1 到最后一列 |
NF | 列数 |
NR | 当前行号 |
FS | 字段分隔符(默认空格) |
OFS | 输出字段分隔符(默认空格) |
RS | 记录分隔符(默认换行) |
ORS | 输出记录分隔符(默认换行) |
awk '{print NR, NF, $0}' file.txt # 打印行号、列数、整行
awk '{print $1, $NF}' file.txt # 打印第一列和最后一列
条件筛选#
awk '$3 > 100' file.txt # 第三列大于 100 的行
awk '$3 > 100 && $4 == "yes"' file.txt # 多条件筛选
awk '/pattern/ {print}' file.txt # 匹配模式的行
awk '!/pattern/ {print}' file.txt # 不匹配模式的行
awk 'NR > 5 && NR < 10 {print}' file.txt # 第 6-9 行
BEGIN/END 块#
awk 'BEGIN {print "Start"} {print $1} END {print "End"}' file.txt
awk 'BEGIN {FS=":"} {print $1}' /etc/passwd # 在处理前设置分隔符
awk '{sum += $2} END {print "Total:", sum}' file.txt # 计算总和
计算统计#
awk '{sum += $2} END {print sum}' file.txt # 计算第二列总和
awk '{count++} END {print count}' file.txt # 统计行数
awk '{max = ($1 > max) ? $1 : max} END {print max}' file.txt # 最大值
awk '{sum += $2; count++} END {print sum/count}' file.txt # 平均值
awk '{if ($1 > max) {max=$1; line=$0}} END {print max, line}' file.txt
格式化输出#
awk '{printf "%-10s %5d %8.2f\n", $1, $2, $3}' file.txt # 格式化输出
awk -v OFS="\t" '{print $1, $2}' file.txt # 使用制表符分隔
实用示例#
# 统计访问日志中每个 IP 的访问次数
awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}' access.log | sort -rnk 2
# 计算 CSV 文件中某列的总和
awk -F ',' '{sum += $3} END {print "Total:", sum}' data.csv
# 提取 JSON 中的某个字段(简单情况)
curl -s https://api.github.com/users/octocat | awk -F '"' '/"login"/ {print $4}'
curl 网络请求#
基本用法#
curl https://example.com # 获取网页内容
curl -o output.html https://example.com # 保存到指定文件
curl -O https://example.com/file.zip # 自动保存文件名
curl -L https://example.com # 跟随重定向
curl -k https://example.com # 忽略 SSL 证书验证
请求参数#
curl -X POST https://api.example.com/data # POST 请求
curl -X PUT https://api.example.com/data # PUT 请求
curl -X DELETE https://api.example.com/data/1 # DELETE 请求
curl -d "name=test&value=123" https://api.example.com # 发送表单数据
curl -d @data.json https://api.example.com # 从文件读取数据
curl -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com # 发送 JSON
curl -H "Authorization: Bearer token" https://api.example.com # 添加认证头
curl -H "User-Agent: MyApp/1.0" https://api.example.com # 自定义 User-Agent
文件上传#
curl -F "file=@path/to/file" https://api.example.com/upload # 上传文件
curl -F "file=@/path/to/image.jpg;type=image/jpeg" https://api.example.com/upload # 指定 MIME 类型
curl -F "name=test" -F "file=@file.txt" https://api.example.com/upload # 多个字段
curl -u username:password https://api.example.com # 基本认证
curl -u username https://api.example.com # 交互式输入密码
curl --oauth2-bearer token https://api.example.com # OAuth2 认证
curl --cert cert.pem --key key.pem https://api.example.com # 客户端证书
Cookie#
curl -c cookies.txt https://example.com # 保存 Cookie 到文件
curl -b cookies.txt https://example.com # 使用 Cookie 文件
curl -b "session=abc123" https://example.com # 直接设置 Cookie
curl -b cookies.txt -c cookies.txt https://example.com # 读写 Cookie
curl -x http://proxy.example.com:8080 https://example.com # HTTP 代理
curl -x socks5://proxy.example.com:1080 https://example.com # SOCKS5 代理
curl --noproxy localhost https://example.com # 不走代理的地址
查看响应信息#
curl -I https://example.com # 只显示响应头
curl -v https://example.com # 详细输出(调试用)
curl -s https://example.com # 静默模式(不显示进度)
curl -w "%{http_code}" https://example.com # 自定义输出格式
curl -w "\nTotal time: %{time_total}s\n" https://example.com # 显示耗时
下载文件#
curl -C - -O https://example.com/large-file.zip # 断点续传
curl -L -O https://example.com/file # 跟随重定向并保存
curl -s https://example.com/api | jq . # 静默模式 + JSON 解析
curl --limit-rate 100K https://example.com/large-file.zip # 限速下载
SSH 远程连接#
基本连接#
ssh user@hostname # 连接远程服务器
ssh user@192.168.1.100 # 使用 IP 地址连接
ssh -p 2222 user@hostname # 指定端口连接
ssh hostname # 使用默认用户连接
ssh -o ConnectTimeout=10 user@hostname # 设置连接超时
SSH 密钥认证#
ssh-keygen -t ed25519 # 生成密钥对(推荐算法)
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_myserver # 指定文件名
ssh-keygen -t rsa -b 4096 # RSA 算法(兼容性更好)
ssh-copy-id user@hostname # 将公钥复制到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@hostname # 指定公钥文件
ssh user@hostname # 使用密钥登录(无需密码)
端口转发#
ssh -L 8080:localhost:3000 user@hostname # 本地端口转发(访问本机 8080 → 远程 3000)
ssh -L 8080:remote-server:3000 user@jump-host # 跳板机端口转发
ssh -R 3000:localhost:8080 user@hostname # 远程端口转发(访问远程 3000 → 本机 8080)
ssh -D 1080 user@hostname # SOCKS 代理
ssh -L 8080:localhost:3000 -N user@hostname # 只转发端口,不执行命令
远程执行命令#
ssh user@hostname "ls -la" # 在远程执行命令
ssh user@hostname "cat /var/log/syslog" # 查看远程日志
ssh user@hostname "cd /home && ls" # 执行多个命令
ssh user@hostname << 'EOF' # 执行多行命令(Here Document)
cd /home
ls -la
echo "Done"
EOF
文件传输(scp)#
scp localfile.txt user@hostname:/remote/path # 上传文件
scp user@hostname:/remote/path/file.txt . # 下载文件
scp -r localfolder/ user@hostname:/remote/path # 上传目录
scp -r user@hostname:/remote/folder/ . # 下载目录
scp -P 2222 file.txt user@hostname:/path # 指定端口
scp -i ~/.ssh/id_ed25519 file.txt user@hostname:/path # 指定密钥
文件传输(rsync)#
rsync -av localfile.txt user@hostname:/remote/path # 同步文件
rsync -av localfolder/ user@hostname:/remote/path/ # 同步目录
rsync -av --delete localfolder/ user@hostname:/remote/path/ # 同步并删除多余文件
rsync -avz localfolder/ user@hostname:/remote/path/ # 压缩传输
rsync -av --exclude="*.log" localfolder/ user@hostname:/remote/path/ # 排除文件
SSH 配置文件#
编辑 ~/.ssh/config:
Host myserver
HostName 192.168.1.100
User edward
Port 2222
IdentityFile ~/.ssh/id_ed25519
ForwardAgent yes
ConnectTimeout 10
Host github
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
然后使用:
ssh myserver # 使用配置连接
scp file.txt myserver:/path # scp 也支持配置
压缩与解压#
tar#
tar -cvf archive.tar files/ # 创建 tar 归档
tar -czvf archive.tar.gz files/ # 创建 gzip 压缩归档
tar -cjvf archive.tar.bz2 files/ # 创建 bzip2 压缩归档
tar -cJvf archive.tar.xz files/ # 创建 xz 压缩归档
tar -tvf archive.tar # 查看归档内容
tar -xvf archive.tar # 解压归档
tar -xzvf archive.tar.gz # 解压 gzip 归档
tar -xjvf archive.tar.bz2 # 解压 bzip2 归档
tar -xJvf archive.tar.xz # 解压 xz 归档
tar -xvf archive.tar -C /dest/path # 解压到指定目录
zip/unzip#
zip archive.zip file1.txt file2.txt # 创建 zip 压缩包
zip -r archive.zip folder/ # 递归压缩目录
unzip archive.zip # 解压 zip 包
unzip archive.zip -d /dest/path # 解压到指定目录
unzip -l archive.zip # 查看 zip 包内容
gzip/gunzip#
gzip file.txt # 压缩文件(生成 file.txt.gz)
gzip -k file.txt # 压缩但保留原文件
gunzip file.txt.gz # 解压文件
gzip -d file.txt.gz # 解压文件(同上)
进程管理#
ps # 查看当前终端进程
ps aux # 查看所有进程(常用)
ps aux | grep "python" # 查找指定进程
ps aux --sort=-%mem | head -10 # 按内存占用排序
ps aux --sort=-%cpu | head -10 # 按 CPU 占用排序
ps -ef # 查看进程树
ps -p <pid> -o %cpu,%mem,cmd # 查看指定进程详情
top#
top # 实时查看进程(按 q 退出)
top -u username # 只显示指定用户的进程
top -p <pid> # 只显示指定进程
top -d 2 # 每 2 秒刷新一次
top 快捷键:
| 快捷键 | 功能 |
|---|
P | 按 CPU 排序 |
M | 按内存排序 |
T | 按时间排序 |
k | 终止进程 |
q | 退出 |
htop(推荐替代 top)#
htop # 更友好的进程查看工具
htop -u username # 过滤用户进程
kill#
kill <pid> # 终止进程(发送 SIGTERM)
kill -9 <pid> # 强制终止进程(发送 SIGKILL)
kill -15 <pid> # 优雅终止(SIGTERM)
kill -HUP <pid> # 重启进程(SIGHUP)
pkill process_name # 按进程名终止
killall process_name # 终止所有同名进程
后台运行#
command & # 在后台运行命令
nohup command & # 后台运行,退出终端后仍继续执行
setsid command # 创建新会话运行命令
screen # 创建屏幕会话
tmux # 创建 tmux 会话(推荐)
jobs # 查看后台任务
fg %1 # 将后台任务 1 切换到前台
bg %1 # 将前台任务 1 切换到后台
磁盘管理#
df # 查看磁盘使用情况
df -h # 人类可读格式
df -h / # 查看指定挂载点
df -i # 查看 inode 使用情况
du # 查看目录大小
du -h # 人类可读格式
du -h -s folder/ # 查看目录总大小
du -h folder/ | sort -rh | head -20 # 按大小排序,显示前 20
du -h --max-depth=2 folder/ # 限制深度
free#
free # 查看内存使用情况
free -h # 人类可读格式
free -m # 以 MB 为单位
free -s 2 # 每 2 秒刷新一次
lsblk#
lsblk # 查看磁盘分区信息
lsblk -f # 显示文件系统类型
文本处理进阶#
sed#
sed 's/old/new/' file.txt # 替换每行第一个匹配
sed 's/old/new/g' file.txt # 全局替换
sed -i 's/old/new/g' file.txt # 原地修改文件
sed 's/old/new/g' -i.bak file.txt # 修改并备份原文件
sed '/pattern/d' file.txt # 删除匹配的行
sed '/pattern/!d' file.txt # 删除不匹配的行
sed '2,5d' file.txt # 删除第 2-5 行
sed '3a new line' file.txt # 在第 3 行后添加
sed '3i new line' file.txt # 在第 3 行前插入
sed -n '2,5p' file.txt # 显示第 2-5 行
sort#
sort file.txt # 按字母排序
sort -n file.txt # 按数字排序
sort -rn file.txt # 按数字降序排序
sort -t ',' -k 2 file.txt # 按逗号分隔的第 2 列排序
sort -u file.txt # 去重排序
sort file1.txt file2.txt # 合并排序
uniq#
sort file.txt | uniq # 去重(需要先排序)
sort file.txt | uniq -c # 统计重复次数
sort file.txt | uniq -d # 只显示重复行
sort file.txt | uniq -u # 只显示不重复行
wc -l file.txt # 统计行数
wc -w file.txt # 统计单词数
wc -c file.txt # 统计字节数
wc -L file.txt # 统计最长行长度
wc file.txt # 显示所有统计信息
diff#
diff file1.txt file2.txt # 比较两个文件
diff -u file1.txt file2.txt # 统一格式显示
diff -r folder1/ folder2/ # 递归比较目录
diff -q folder1/ folder2/ # 只显示差异存在
sdiff file1.txt file2.txt # 并排显示差异
comm#
comm file1.txt file2.txt # 比较两个已排序文件
comm -1 file1.txt file2.txt # 不显示只在 file1 中的行
comm -2 file1.txt file2.txt # 不显示只在 file2 中的行
comm -3 file1.txt file2.txt # 只显示共同行
查找与搜索#
find#
find . -name "*.txt" # 在当前目录下查找所有 txt 文件
find /home -type f -name "*.log" # 在 /home 目录下查找所有 log 文件
find . -size +10M # 查找大于 10MB 的文件
find . -size -1k # 查找小于 1KB 的文件
find . -mtime -7 # 查找最近 7 天内修改的文件
find . -atime -1 # 查找最近 1 天内访问的文件
find . -user edward # 查找指定用户的文件
find . -type d -name "__pycache__" -exec rm -rf {} + # 删除所有 __pycache__ 目录
find . -name "*.pyc" -delete # 删除所有 pyc 文件
find . -exec grep -l "pattern" {} \; # 在找到的文件中搜索模式
grep#
grep "pattern" file.txt # 在文件中查找模式
grep -r "pattern" . # 递归查找目录中的所有文件
grep -i "pattern" file.txt # 忽略大小写
grep -n "pattern" file.txt # 显示匹配行的行号
grep -v "pattern" file.txt # 显示不匹配的行
grep -c "pattern" file.txt # 统计匹配行数
grep -A 3 "pattern" file.txt # 显示匹配行及后面 3 行
grep -B 3 "pattern" file.txt # 显示匹配行及前面 3 行
grep -C 3 "pattern" file.txt # 显示匹配行及前后 3 行
grep -l "pattern" *.txt # 只显示匹配的文件名
grep -E "pattern1|pattern2" file.txt # 使用扩展正则表达式
which/whereis/locate#
which python # 查找命令的位置(可执行文件)
whereis python # 查找命令的二进制、源码和手册
locate "*.txt" # 快速查找文件(基于数据库)
updatedb # 更新 locate 数据库
其他常用命令#
wget#
wget https://example.com/file.zip # 下载文件
wget -O output.zip https://example.com/file.zip # 指定文件名
wget -c https://example.com/large.zip # 断点续传
wget -r https://example.com/docs/ # 递归下载(镜像网站)
wget -np https://example.com/docs/ # 不下载父目录
wget -q https://example.com/file.zip # 静默模式
head/tail#
head -n 10 file.txt # 显示前 10 行
head -c 100 file.txt # 显示前 100 字节
tail -n 10 file.txt # 显示后 10 行
tail -f log.txt # 实时显示文件末尾
tail -F log.txt # 实时显示(文件被替换后仍能追踪)
touch#
touch file.txt # 创建空文件
touch -t 202401010000 file.txt # 设置文件时间戳
touch -a file.txt # 只修改访问时间
touch -m file.txt # 只修改修改时间
ln -s /path/to/target linkname # 创建符号链接(软链接)
ln /path/to/target linkname # 创建硬链接
ls -la linkname # 查看链接指向
readlink linkname # 查看符号链接目标
date#
date # 显示当前时间
date +"%Y-%m-%d %H:%M:%S" # 自定义格式
date -d "yesterday" # 显示昨天的日期
date -d "next week" # 显示下周的日期
date -s "2024-01-01 12:00:00" # 设置系统时间(需要 root)
cal#
cal # 显示当前月份日历
cal 2024 # 显示全年日历
cal 12 2024 # 显示指定月份
环境变量#
查看与设置#
echo $PATH # 查看 PATH 环境变量
env # 查看所有环境变量
printenv # 查看所有环境变量(更简洁)
export MY_VAR="hello" # 设置临时环境变量(仅当前会话有效)
export PATH="$PATH:/my/custom/path" # 添加到 PATH
MY_VAR="value" command # 为单个命令设置环境变量
永久设置#
编辑 ~/.bashrc 或 ~/.zshrc 文件,添加:
export PATH="$PATH:/my/custom/path"
export EDITOR="vim"
export LANG="zh_CN.UTF-8"
然后执行:
常用环境变量#
| 变量 | 说明 |
|---|
HOME | 用户主目录 |
PATH | 命令搜索路径 |
USER | 当前用户名 |
SHELL | 当前 Shell |
EDITOR | 默认编辑器 |
LANG | 语言设置 |
PWD | 当前工作目录 |
实用技巧#
命令历史#
history # 查看命令历史
history | grep "git" # 搜索历史命令
history -c # 清空命令历史
!123 # 执行历史中的第 123 条命令
!! # 执行上一条命令
!$ # 引用上一条命令的最后一个参数
!git # 执行最近一条 git 命令
Ctrl + R # 反向搜索命令历史
Tab 补全#
按 Tab 键可以自动补全命令、文件名、目录名等:
ls docu<Tab> # 自动补全为 documents
cd proj<Tab> # 自动补全为 projects
git che<Tab> # 自动补全为 checkout/cherry-pick 等
快捷键#
| 快捷键 | 功能 |
|---|
Ctrl + C | 终止当前命令 |
Ctrl + \ | 终止进程并生成 core dump(发送 SIGQUIT 信号) |
Ctrl + D | 退出 Shell(等价于 exit) |
Ctrl + L | 清屏(等价于 clear) |
Ctrl + A | 移动到命令行开头 |
Ctrl + E | 移动到命令行结尾 |
Ctrl + U | 删除光标前的所有字符 |
Ctrl + K | 删除光标后的所有字符 |
Ctrl + W | 删除光标前的一个单词 |
Ctrl + Y | 粘贴上次删除的内容 |
Ctrl + R | 反向搜索命令历史 |
Ctrl + Z | 暂停当前命令(放入后台) |
Ctrl + T | 交换光标前后两个字符 |
命令别名#
编辑 ~/.bashrc 添加别名:
alias ll='ls -la'
alias gs='git status'
alias ga='git add'
alias gc='git commit -m'
alias gp='git push'
然后执行 source ~/.bashrc 使别名生效。
命令替换#
echo "Current date: $(date)" # 命令替换(推荐)
echo "Current date: `date`" # 命令替换(传统方式)
files=$(ls *.txt) # 将命令输出赋值给变量
for file in $(ls *.txt); do echo $file; done
文件操作命令#
| 命令 | 用途 |
|---|
pwd | 查看当前目录 |
ls | 列出目录内容 |
cd | 切换目录 |
mkdir | 创建目录 |
touch | 创建文件 |
cat | 查看文件内容 |
cp | 复制文件 |
mv | 移动/重命名文件 |
rm | 删除文件 |
ln | 创建链接 |
权限管理命令#
| 命令 | 用途 |
|---|
chmod | 修改文件权限 |
chown | 修改文件所有者 |
chgrp | 修改文件组 |
Git 命令#
| 命令 | 用途 |
|---|
git init | 初始化仓库 |
git add | 添加到暂存区 |
git commit | 提交到本地仓库 |
git push | 推送到远程仓库 |
git pull | 拉取远程更新 |
git branch | 分支管理 |
git switch | 切换分支 |
git merge | 合并分支 |
git rebase | 变基 |
git stash | 暂存修改 |
git restore | 恢复文件 |
文本处理命令#
| 命令 | 用途 |
|---|
grep | 文本搜索 |
awk | 文本处理和数据提取 |
sed | 流编辑 |
sort | 排序 |
uniq | 去重 |
wc | 统计 |
diff | 文件比较 |
查找命令#
| 命令 | 用途 |
|---|
find | 文件查找 |
which | 命令位置 |
whereis | 命令位置(含手册) |
locate | 快速文件查找 |
网络命令#
| 命令 | 用途 |
|---|
curl | 发送 HTTP 请求 |
wget | 下载文件 |
ssh | 远程连接服务器 |
scp | 安全文件传输 |
rsync | 同步文件 |
进程管理命令#
| 命令 | 用途 |
|---|
ps | 查看进程 |
top | 实时进程监控 |
htop | 更友好的进程监控 |
kill | 终止进程 |
磁盘管理命令#
| 命令 | 用途 |
|---|
df | 磁盘使用情况 |
du | 目录大小 |
free | 内存使用情况 |
压缩命令#
| 命令 | 用途 |
|---|
tar | 创建/解压 tar 归档 |
zip/unzip | 创建/解压 zip |
gzip/gunzip | 压缩/解压 gzip |
管道与重定向#
| 符号 | 用途 |
|---|
| ` | ` |
> | 输出重定向(覆盖) |
>> | 输出重定向(追加) |
2> | 错误输出重定向 |
2>&1 | 错误重定向到标准输出 |
< | 输入重定向 |
通过这一课的学习,你已经掌握了 Shell 和常用命令行工具的基本操作。这些工具是高效开发的基础,熟练使用它们可以极大提升你的工作效率。继续学习,探索更多强大的命令行技巧!