元数据卡
- 前置知识:ch02-file-operations
- 预计时间:10 分钟
- 阅读模式:理解原理比记住参数重要
一个你没想过的问题
"你刚才敲了 whoami,它找到了。你敲了 ls,它也找到了。"工坊主人不知道什么时候坐到了你的旁边。"但你想过没有——电脑是怎么知道 ls 在哪的?你的终端里并没有一个叫 ls 的程序摆在眼前。"
你愣了一下。"对哦……我从来没考虑过这个问题。"
"你身上一直带着一张地图。"工坊主人指了指你的胸口。"你走到哪都带着它,但你自己看不见。"
env:你的隐形背包
你的终端会话背后,Shell 一直维护着一组环境变量——其实就是一些键值对,告诉程序关于你和系统的基本信息。
# 看看你身上背着哪些信息
env | head -10
# 查看单个变量
echo $HOME # 你的家目录
echo $USER # 你的用户名
echo $SHELL # 你在用什么 Shell
echo $PATH # 命令搜索路径(重点!)语言:Shell (Bash/Zsh) 如何运行:直接输入 预期输出:变量对应的值——$HOME 一般是 /home/steven你试试:echo $LANG 看系统语言,echo $PWD 看当前目录
看到 $ 了吗?在 Shell 里,$变量名 表示引用这个变量。提示符上的 ~ 和 $HOME 基本等价。
PATH:Shell 的地图
重点来了——PATH。这是你所有命令能被找到的秘密。
# 看看 PATH 里有什么
echo $PATH
# 输出示例:
# /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/home/steven/.local/bin语言:Shell (Bash/Zsh) 如何运行:直接输入 预期输出:一串用冒号(:)隔开的目录路径 你试试:which ls 查看 ls 具体在哪个目录,which python3 看 Python 在哪
PATH 的工作原理很简单。当你在终端输入 ls:
- Shell 看 PATH:
/usr/local/bin:/usr/bin:/bin:… - 从左到右,在第一个目录里找
ls - 在
/usr/bin里找到了——执行它!不再往后找
如果两个目录里有同名的程序,只执行第一个找到的。 这就是为什么你装新版本的程序后,有时需要把它的目录加到 PATH 前面。
which:查命令的来源
# 看看某个命令到底在哪个目录
which ls
# /usr/bin/ls
which python3
# /usr/bin/python3
which -a ls
# 显示所有找到的 ls(不只是第一个)语言:Shell (Bash/Zsh) 如何运行:which <命令名>预期输出:命令的完整路径,或 "not found" 你试试:which cd —— 等等,它可能什么都没输出。因为 cd 是 Shell 内置命令,不是外部程序。
export:给自己加点料
你可以创建自己的环境变量:
# 设置一个变量——但只在当前会话有效
MY_VAR="Hello from my shell"
echo $MY_VAR
# Hello from my shell
# 让子进程也能访问它(用 export)
export MY_VAR="子进程也能看到我了"语言:Shell (Bash/Zsh) 如何运行:测试创建,echo 确认值 你试试:export WORKSHOP_NAME="变量村" && echo $WORKSHOP_NAME
不加 export 的变量只在当前 shell 可见。加了 export,你新开的程序也能看到它。
.bashrc / .zshrc:让变量活到下次
上面创建的变量在你关掉终端之后就消失了。要让它永久生效,需要写进 Shell 的配置文件。
Bash 用户写 ~/.bashrc,Zsh 用户写 ~/.zshrc。不确定自己在用哪个?echo $SHELL 告诉你。
# 用 echo 加上 >> 追加一行到配置文件
echo 'export MY_VAR="Hello from my shell"' >> ~/.bashrc
# 重新加载——让改动立即生效
source ~/.bashrc语言:Shell (Bash/Zsh) 如何运行:先用 export 测试变量,再写入配置文件,最后 source 重载 你试试:把 ~/my-tools 加入 PATH:export PATH="$HOME/my-tools:$PATH"(先测试,再写进配置文件)
把自定义路径加入 PATH
# 先测试(当前会话)
export PATH="$HOME/my-tools:$PATH"
echo $PATH
# /home/steven/my-tools:/usr/local/bin:/usr/bin:...
# 确认能工作后,写进配置文件
echo 'export PATH="$HOME/my-tools:$PATH"' >> ~/.bashrc注意:写入时用的 >> 追加,不是 > 覆盖。写错 .bashrc 会导致 Shell 启动时报错。
改坏了怎么办? 如果你把配置文件弄乱了,可以从 /etc/skel/.bashrc 恢复默认版本,或者新建一个空的:
echo "# Default bashrc" > ~/.bashrc
source ~/.bashrc旅人笔记
环境变量是 Shell 的隐形背包。
env查看全部。$变量名引用变量的值。
PATH 是 Shell 找命令的目录清单,按顺序检查。which查某个命令实际存哪。export让变量传递给子进程。
想永久生效?写进.bashrc或.zshrc,然后用source重载。
→ 下一步:通配符和管道
你现在能创建、修改、删除文件了。但你有一堆文件要批量处理怎么办?一个一个敲?