新手刚接触 Linux 的时候,最大的困惑往往不是命令太多记不住,而是打开终端后面对那一大堆不知道干嘛的目录,心里发慌:/, /root, /home, /usr, /etc, /var, /opt…… 这些到底是干什么的?我到底该把东西放哪里?更别提cd /home/user/project/config和cd config到底有什么区别——为什么有时候能用,有时候就报No such file or directory。
这篇文章就把 Linux 的目录结构和路径机制一次讲透。我会从设计逻辑讲起,再落实到cd、pwd、ls这些日常必用命令上,最后集中聊聊写脚本、配服务时因为路径踩坑的那些破事。不管你是刚装好虚拟机的大学生,还是第一次接触云服务器的开发者,看完这篇至少能明白自己在文件系统里的“坐标”,并且知道什么时候该用绝对路径、什么时候该用相对路径。
1. 目录结构不是随便定的:先搞懂 Linux 文件系统的设计逻辑
1.1 一切从根开始:/是整个文件系统的“锚点”
Windows 用户初看 Linux 目录会很不适应,因为 Windows 是“盘符 + 多根”的逻辑(C盘、D盘各管各的),而 Linux 只有一个根目录/。无论你插了几块硬盘、几个分区,最终都被挂载到根目录下的某个挂载点上,用户看到的是一个统一的、完整的目录树。
这个设计带来的直接好处是:路径的表达方式完全统一。你从/出发,沿着目录树的每一层向下走,最终一定能定位到任何一个文件或目录。比如/var/log/nginx/access.log,就是一个从根出发的完整坐标,任何用户、任何脚本、任何时刻执行这条路径,指向的都是同一个文件——只要它存在。
根目录/本身包含了很多一级子目录,这些目录不是随便命名的,它们基本遵循文件系统层次结构标准(FHS)。理解这套标准的初衷,不是为了背目录名,而是为了知道“什么类型的数据该放哪里”,以及“为什么有些目录不能乱动”。
1.2 一张表理清核心目录:不需要全背,但这几个必须认识
经常有人说“Linux 目录太多了根本记不住”,实际情况是日常开发和维护中真正高频接触的目录不超过十个。先把这些核心目录装进脑子里,其他的遇到再查不迟。
| 目录 | 存放内容 | 日常注意点 |
|---|---|---|
/bin | 基本命令的二进制文件,如ls、cat、cp | 现代发行版多与/usr/bin合并,不必死记 |
/sbin | 系统管理类命令,如fdisk、mount | 普通用户可能不在PATH中,需用全路径执行 |
/etc | 系统和服务配置文件 | 改配置前先备份,多数服务改完要重启 |
/home | 普通用户的家目录 | 自己的数据默认放这里,如/home/用户名 |
/root | root 用户的家目录 | 不是/home/root,这是个经典误区 |
/usr | 应用程序和共享数据 | 安装的软件、库文件大量在此 |
/var | 经常变化的数据:日志、缓存、队列 | /var/log排错第一站 |
/tmp | 临时文件 | 重启可能被清空,别放重要数据 |
/dev | 设备文件抽象 | 硬盘、终端等都被映射成文件 |
/proc | 内核和进程信息的虚拟文件系统 | 不是真实文件,但可以读取系统状态 |
这里我要特别强调几个容易出问题的点。
第一,/etc不要乱改权限和所有者。很多服务启动失败就是因为配置文件被不小心chmod或chown搞坏了,而有些发行版对/etc/ssh/ssh_host_*这类密钥文件的权限极其敏感,权限不对直接拒绝启动。
第二,/tmp和/var/tmp不一样。传统上/tmp会在重启时被清空,而/var/tmp保留时间更长。某些安装程序默认把临时文件放/tmp,如果你在跑一个长时间任务,中途重启了机器,临时文件没了导致任务失败,这种坑我踩过不止一次。
第三,/usr不是“用户目录”的缩写,而是“Unix System Resources”的演变说法。你的个人文件不要往/usr里塞,系统升级时很容易被覆盖或清理。同样地,/opt一般是第三方手动安装软件的目录,比如某些商业软件、IDE,不要自作主张把项目源码放这里。
1.3 为什么要理解目录用途:权限、备份、日志定位全靠它
理解目录结构不只是为了“不迷路”,更重要的是建立排查问题的直觉。
比如网站访问变慢,第一反应去/var/log/nginx/error.log或/var/log/messages看输出;比如磁盘空间告警,du -sh /var/log/*扫一遍马上能看出是不是日志膨胀;比如装了一个软件找不到可执行文件,先查which结果,再确认它是不是被装到了/usr/local/bin——因为/usr/local专门留给本机管理员手动安装的软件,这个目录在PATH中通常排在系统目录之后。
如果你知道各类数据文件的“默认住址”,排查问题的时间至少缩短一半。反过来,如果连目录用途都没概念,遇到问题只能满世界find /,把整个磁盘扫一遍,低效且危险。
2. 绝对路径 vs 相对路径:核心区别和“用直觉选路径”的方法
2.1 一个生活类比:完整地址 vs “往前走右转”
先说最基本的定义。
绝对路径(Absolute Path):从根目录/开始写,完整描述从文件系统根部到目标位置的每一级目录。例如/etc/nginx/nginx.conf。
相对路径(Relative Path):从“当前位置”(即当前工作目录,也就是pwd输出的那个路径)开始写,描述的是“从我现在站的位置,怎么走到目标”。例如../conf/nginx.conf。
用一个生活类比来记:绝对路径是别人问你家在哪,你报“某省某市某区某路某号”,谁拿到都能找到;相对路径是你在商场里跟朋友说“从这家奶茶店往前走两个店铺右转就到了”,这句话只有在“奶茶店门口”这个前提下才对。两个人站的位置不一样,听到同样的指引,走向的是不同的地方。
这个类比基本覆盖了所有路径问题的本质:绝对路径不怕“语境”变化,相对路径依赖“当前在哪”这个前提。很多人出问题就是没搞清楚自己写路径时隐含了这个前提。
2.2.、..、~:三个小符号决定了相对路径的表达能力
相对路径的实操能力建立在这几个特殊符号上。
.代表当前目录。单独用时没什么存在感,但在脚本里执行./script.sh表示“当前目录下的脚本”,在执行文件时这个点不能丢。..代表上一级目录。../..就是上两级。这是相对路径最重要的组成部分,回退全靠它。~代表当前用户的家目录。~本身等价于/home/当前用户名(root 则为/root)。注意~otheruser可以表示某个指定用户的家目录,但这个用法在实际中容易造成误解,脚本里我几乎不用。
还需要澄清一个高频误解:~不是“相对路径”,也不是“绝对路径”的等价物。它是 shell 的波浪号展开特性,在输入命令时被展开成具体的绝对路径。你在 shell 里能用~/project,但在某些程序的配置文件里、在cron任务里、在系统服务的环境变量里,这个小小的~并不会自动展开,可能导致路径找不到。所以写脚本、写配置时,我会老老实实用完整的/home/用户名/xxx,最大程度避免歧义。
2.3 什么时候该用哪种?我的经验判断法
很多教程喜欢说“建议尽量用绝对路径”,这话一半对一半坑。实际我的经验是分场景的:
优先用绝对路径的场景:
- 写脚本文件、定时任务、systemd 服务配置。因为这些程序执行时的“当前目录”根本不由你控制,可能是根目录、可能是服务运行目录,相对路径一换环境就废。
- 跨目录操作,比如你人在
/home/user/project/logs,要操作/etc/nginx/conf.d/下的文件,用绝对路径虽然长,但不容易出错。 - 需要让别人(或未来的自己)看的文档、命令记录。绝对路径自解释,任何人复制过去都能执行。
优先用相对路径的场景:
- 在当前项目目录内部快速移动。
cd ./src/components比cd /home/user/project/src/components省事得多,而且项目整体迁移位置后命令仍然有效。 - 目标位置和当前位置有清晰的层级关系,比如就在上一级目录的同级某个文件夹里,
cd ../sibling一眼就能看懂。 - 交互式 shell 中频繁切换目录。此时手指比大脑快,
cd ../..、cd ~/xxx配合 tab 补全非常流畅。
一句话总结我的判断逻辑:“人读”的路径用相对(省事、直观),“机器读”的路径用绝对(稳定、无歧义)。交互式命令是人读的,脚本和服务是机器读的,按这个原则选路径基本不会翻车。
2.4 直观对比:同样的操作,两种路径到底差在哪
举个具体例子。假设当前目录是/home/user/project/logs,你想查看上一级目录config下的app.conf文件。
绝对路径写法:
cat /home/user/project/config/app.conf相对路径写法:
cat ../config/app.conf两条命令效果完全一样。但如果你的当前目录变了,比如现在在/tmp下,第一条命令照样能执行,第二条就会报No such file or directory。这就是“语境依赖”的本质。
再举一个反向案例:你人在/home/user/project/config,需要看logs目录下的error.log。
# 绝对路径 cat /home/user/project/logs/error.log # 相对路径 cat ../logs/error.log注意这里不是cat logs/error.log,因为logs不是当前目录的子目录,而是兄弟目录。新手最容易在这里犯迷糊:以为“我想去 logs,那我直接写 logs 就行”,结果忘了logs根本不在当前目录下。正确的相对路径必须从当前位置一级一级构建出路线。
3. 实操:用 cd / pwd / ls 把路径感养成本能
3.1 pwd 是你的第一导航工具
很多老手都有一个习惯:每到一个陌生环境,第一件事就是敲pwd,确认自己在哪里。这句话听起来像废话,但实际操作中,超过一半的路径错误都是因为“我以为自己在 A 目录,其实在 B 目录”。
pwd默认输出逻辑路径,也就是你通过cd进入的路径。如果你通过符号链接进入了某个目录,pwd显示的可能是链接路径而不是真实路径。这时候用pwd -P(物理路径)可以显示真实路径。这个区别在写脚本判断目录时特别重要,后面我专门讲。
日常操作建议:
- 切换目录前不确定就去路,先
pwd。 - 发现脚本路径不对,第一步就是
pwd看看脚本背后到底在哪个目录下执行。 - 把
pwd纳入肌肉记忆,就像写代码前先git status一样自然。
3.2 cd 的各种姿势:回退、跳转、快速返航
cd是“切换目录命令”,能玩出的花样其实不少。
| 场景 | 命令 | 说明 |
|---|---|---|
| 回到当前用户家目录 | cd或cd ~ | 直接回车也行 |
| 回到上一次所在目录 | cd - | 在 A、B 目录间快速往返时神器 |
| 进入上级目录 | cd .. | 上两级就cd ../.. |
| 进入指定家目录 | cd ~username | 偶尔用到,注意权限 |
| 跳转到任意绝对路径 | cd /var/log | 最常见 |
| 在当前目录附近快速移动 | cd ../project2 | 相对路径,同级快速切换 |
cd -是我日常用的最多的技巧之一。在配置文件的目录和日志目录之间来回跑时,cd -比重新敲一长串路径快得多,而且不容易出错。它的原理是 shell 记住了上一次所在目录(存在OLDPWD环境变量里),执行cd -等价于cd "$OLDPWD"并打印新目录名。
再强调一个基础但容易忽略的:cd命令的参数本质上就是一个路径。所以cd /var/log用的是绝对路径,cd ../logs用的是相对路径。理解了这一点,你在cp、rm、tar后面写路径也是一样的逻辑。
3.3 ls 不只是“查看”,更是验证路径是否有效的工具
ls常被当成“列目录”工具,但在路径学习阶段,它是最好的验证工具。
# 查看当前目录内容 ls # 查看详细属性,包括权限、所有者 ls -l # 查看包括隐藏文件在内的所有内容 ls -a # 组合使用,这是最常用的 ls -la # 查看指定路径下的内容,绝对路径相对路径都行 ls -la /etc/nginx ls -la ../../config我有一个习惯:不确定某个路径到底对不对,先ls一下看看能不能列出内容,而不是直接执行真正会改动文件的命令(比如rm或mv)。ls不会产生破坏性后果,是标准的“路径探针”。
如果ls /some/path返回No such file or directory,你写路径的层级错了;如果返回Permission denied,路径本身可能是对的,但你没有权限查看或进入,需要检查目录权限设置。这两个错误信息的意义差别很大,别搞混。
3.4 一个完整的路径手感训练:从根目录摸到一个深嵌套项目
跟着我实际走一遍。假设系统上有一个项目目录在/srv/websites/blog-2024/app/backend/storage/logs,我们从/开始,看看怎么高效地到达。
# 第一步,回到根 cd / # 现在我需要进入 /srv 就能看到这个目录 ls srv # 如果确认存在,继续用相对路径下行 cd srv # 再进入下一级 cd websites/blog-2024 # 到这里我想快速看看整个项目的结构 ls -la # 继续深入 cd app/backend/storage/logs # 确认位置 pwd # 输出 /srv/websites/blog-2024/app/backend/storage/logs这个过程中我用的是相对路径逐步下行,交互式操作很自然。但如果我写一个部署脚本,目标路径绝对不会写成srv/websites/blog-2024,而是完整的/srv/websites/blog-2024,因为脚本的执行目录不可控,少了开头那个斜杠,整个路径就变成了相对路径,一换环境必挂。
训练方法很简单:在真实或虚拟机环境里,故意不看提示符的完整路径,只用cd和pwd在目录树中来回走,每到一个目标就停下来问自己“我现在在哪”“我刚才用的是什么路径”。反复几次,路径感的“肌肉记忆”就建立了。
3.5 tap 补全:把长路径错误降到最低的免错技巧
Tab 键路径补全是我所有路径实操里最想强调的一点。你不需要背完整的长路径,只要打出前几个字符,然后按 Tab,shell 会尝试补全剩余部分;如果有多个匹配项,再按一次会列出候选。
cd /etc/ngi[TAB] # 自动补全为 /etc/nginx/这个技巧极大降低了手打路径导致的大小写、少字母问题。而且结合相对路径使用,比如cd ../proj[TAB],能快速跳转到附近目录,非常丝滑。我见过太多新手手打一长串路径然后因为一个小字母卡半天,实际上用补全三秒就解决。
需要留意的是,shell 补全的是“当前存在的路径”。如果某个路径不存在,补全失败或不响应,这本身就是一个信号——你的路径可能写错了。所以 tap 补全不仅仅是省事,更是一个最朴素的“路径存在性检查器”。
4. 路径在脚本和配置文件里的那些坑:新手必踩的隐形雷区
4.1 让脚本不依赖“当前目录”:最经典的路径事故现场
我个人认为,Linux 路径问题里最阴险的坑,就是脚本中使用了相对路径。我复盘过很多次事故,绝大多数“脚本在我手动执行时正常,一放到定时任务里就报错”的案例,根源都是相对路径。
原因很简单:手动执行时,你的“当前目录”恰好和脚本代码里假设的当前目录一致,所以相对路径碰巧有效。但脚本一旦被定时任务、服务管理器、其他脚本以不同的工作目录调用,所有相对路径全部失效。
比如一个备份脚本,里面写了:
tar -czf backup.tar.gz ./data假设你手动执行时人在/home/user/project,它打包./data没问题。可如果添加到 crontab 后,cron 执行脚本时的工作目录通常是你执行crontab -e时的环境,但更常见的是各种 init 系统、CI 任务会设定某个默认目录,那么./data指向的就不再是你期待的那个data目录,备份文件要么没生成,要么生成到了奇怪的地方。
解决思路有几种,按优先级推荐:
第一,脚本开头显式切换目录。利用脚本自身所在路径定位,然后cd过去:
# 获取脚本所在目录并切换 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR"这句是行业里非常经典的“定位脚本自身位置”的写法。原理是先用dirname取出脚本路径的目录部分,再cd进这个目录后pwd拿到绝对路径。拿到之后,脚本里的相对路径都以这个目录作为基准,就不会受外部工作目录影响。
第二,全脚本使用绝对路径。把关键路径定义为变量,需要改时只改一处:
PROJECT_ROOT="/srv/websites/blog-2024" LOG_DIR="$PROJECT_ROOT/app/backend/storage/logs" BACKUP_FILE="$PROJECT_ROOT/backups/backup-$(date +%F).tar.gz"这样做的优点是任何人拿到脚本都能看懂路径具体指向哪里;缺点是项目迁移后需要改变量,不如第一种方式自动适应位置变化。
第三,在调用脚本的地方显式指定工作目录。比如在 systemd 服务文件的WorkingDirectory=指令里写WorkingDirectory=/srv/websites/blog-2024,这样服务启动时工作目录固定,相对路径也相对安全。
4.2 符号链接:为什么路径看起来没问题,实际文件却不在了
Linux 的符号链接(symlink)相当于 Windows 的快捷方式,但它更底层、更“透明”。你在ls -l里看到conf -> /etc/nginx/conf.d/,这表示conf是一个链接,指向/etc/nginx/conf.d这个目录。
符号链接带来的路径问题有两个层次。
第一,pwd显示的内容可能和真实路径不一致。你cd /opt/app/current,而current是链接到/opt/app/releases/20250120的,那么pwd可能显示/opt/app/current,但pwd -P显示/opt/app/releases/20250120。如果你写的脚本里用$(pwd)拼路径,可能拿到的是链接路径,程序本身大概率没区别,但一旦你依赖这个路径去生成日志路径、清理目录,就会产生混乱。
第二,链接本身分“绝对链接”和“相对链接”。ln -s /var/log/nginx /tmp/nginxlogs这种是绝对链接,写死了指向/var/log/nginx;ln -s ../logs /tmp/nginxlogs是相对链接,它的指向会被解析为一个相对于链接文件所在位置的路径。如果整个目录结构被移动,绝对链接会失效,而相对链接在结构内部移动时仍可能有效。这个知识点在小规模环境里不常用,但在容器镜像、部署发布目录(比如releases/下面用软链指向current)中经常出现。
排查符号链接问题的基本工具:
# 查看路径的真实物理位置 readlink -f /opt/app/current # 查找某个链接指向哪里 ls -l /opt/app/current # 更直接的命令,realpath 命令也很实用 realpath /opt/app/current4.3 PATH 环境变量:为什么你输命令提示 not found
PATH是一串由冒号分隔的目录列表。当你在 shell 里输入没有路径前缀的命令(如nginx -t而不是/usr/sbin/nginx -t),shell 会按照PATH里列出的目录顺序,依次查找名为nginx的可执行文件。
最常见的问题是:你明明安装了某个软件,输入命令却提示command not found。原因通常是该软件的二进制目录没有加入PATH,比如手动编译安装的东西默认放到了/usr/local/xxx/bin,而这个目录不在当前用户的PATH中。
你可以用以下方法查看和修改:
# 查看当前 PATH echo $PATH # 临时追加一个目录(仅当前 shell 会话有效) export PATH=$PATH:/opt/myapp/bin # 永久修改,需要写入配置文件 # 最常用的是修改 ~/.bashrc,在末尾加一行: # export PATH=$PATH:/opt/myapp/bin # 然后 source ~/.bashrc 使其立刻生效关于PATH,有几个实践要点:
- 不要用相对路径拼
PATH。export PATH=./bin:$PATH这种写法极其危险,因为“当前位置”一变,./bin指向的目录就不同了。实际工作中我看到不少教程为了省事这么写,误导性很大。 - 调试命令来源用
type或which。type nginx会告诉你这个命令是通过什么路径找到的,是有别名还是真实可执行文件。 - 权限问题导致 not found。如果你确认二进制存在且
PATH正确,但仍然提示 not found,用ls -l检查该文件是否拥有可执行权限(x权限位)。 - 普通用户 vs root 用户的
PATH不同。很多系统管理命令放在/sbin或/usr/sbin,普通用户的PATH里根本不包含这些目录,所以用普通用户执行iptables -L经常提示 not found,而 root 却正常。这也是为什么有人会建议普通用户调试系统命令时用绝对路径/sbin/iptables -L。
4.4 路径中的空格、特殊字符与大小写:三座隐蔽的大山
Linux 路径中的空格不像某些系统会自动处理,默认情况下 shell 会把空格当作参数分隔符。比如你有一个目录叫My Documents,直接写cd My Documents会被解析成两个参数,shell 会去找名为My的目录。
解决方式无非两种:加引号或转义。
# 用引号包住整个路径(推荐) cd "My Documents" # 或用反斜杠转义空格 cd My\ Documents特殊字符同理。路径包含$、&、()、[]、*等字符时,如果在 shell 里裸写,会被解释成变量、通配符等特殊含义。见到这类路径不要慌,统一用引号包起来处理。
大小写问题就更隐蔽了。Linux 是大小写敏感的系统,Config.conf、config.conf、CONFIG.CONF是三个完全不同的文件。我曾经排过一个故障,系统配置加载正常,但程序就是读取不到自定义配置,折腾半天发现配置文件被写成了App.Conf,而程序读的是app.conf。这个特性对于从 Windows/macOS 转来的用户特别容易忽视。
4.5 路径权限的底层逻辑:命令通过不代表权限通过
路径相关的最后一类坑,也是最系统性的坑:没有目录权限。你要进入某个子目录并查看里面的文件,需要的不仅是对文件本身的读权限,还要有父目录的执行权限(x权限)。Linux 的目录权限规则比较反直觉:
- 对目录有读权限(
r),可以列出目录里的文件名。 - 对目录有执行权限(
x),才能进入该目录并访问其中的内容。 - 如果某个父目录缺少执行权限,即使你知道完整路径也能写出精确地址,仍然无法访问其中的任何文件或子目录。
一种直观的理解是:绝对路径的每一级目录都需要有对应的执行权限,路径才能走通,就像一扇门一把钥匙,中间任何一道门没钥匙,后面再富丽堂皇也进不去。所以排查Permission denied时,从根目录一级一级往下检查权限会发现卡点。
# 逐级查看权限 ls -ld / /srv /srv/websites /srv/websites/blog-20245. 常见问题与高频排查技巧:我把踩过的坑整理成了速查表
5.1 最常见的五个报错,一眼定位问题方向
| 报错信息 | 大概率原因 | 优先检查项 |
|---|---|---|
No such file or directory | 路径写错层级、文件名拼写错误、目标根本不存在 | 用ls探一下父级目录,确认目标确实存在 |
Permission denied | 权限不够;缺少目录执行权限;文件无读权限 | 用ls -ld逐级查看路径权限 |
command not found | PATH 里没包含该可执行文件;命令根本未安装;无执行权限 | which/type,检查/usr/bin等 |
Not a directory | 把普通文件当成目录去cd了 | 先ls -l确认目标类型 |
/bin/bash^M: bad interpreter | 文件是 Windows 换行格式(CRLF) | 用sed -i 's/\r$//' 脚本.sh转换 |
第五个问题虽然不是纯路径问题,但在脚本相关报错中出现频率极高,因为 Windows 下编辑过的脚本传到服务器,换行符不对,脚本第一行解释器路径就解析失败。这种问题看报错会以为路径有问题,实际是文本编码问题。
5.2 排查路径问题的三件套:pwd / ls / readlink
我自己排查路径问题的流程基本固定:
- 先确认“我在哪”:
pwd。这一步排除语境干扰,特别适合排查相对路径的误用。 - 再确认“目标在不在”:
ls 目标路径。用ls去试探路径能不能解析、有没有权限,比直接执行业务命令安全得多。 - 最后确认“是不是符号链接”:
ls -ld看属性,readlink -f看真实路径。这一步往往能解开“路径看似正确但实际不是”的谜团。
这三步走完,绝大多数路径问题都能定位。剩下的可能就是权限层级问题,再配合ls -ld逐级查即可。
5.3 养成三个路径好习惯,少踩 90% 的坑
第一,写关键命令或脚本前,先想清楚当前工作目录是什么。习惯性pwd一下,比什么都管用。
第二,脚本里全部用绝对路径或用脚本自身定位。千万不要相信“这次碰巧没事”,服务编排、容器、CI 等环境中工作目录完全不可控。
第三,路径的人上人原则:所有的路径都用引号包起来(能包就把变量也包起来)。写脚本时凡是变量引用路径,一律写成"$VAR",防止路径内部有空格导致解析错误。这个习惯能在容器和自动化环境里省下无数 debug 时间。
6. 最后分享几个我日常在用的路径小技巧
文章写到这里,核心内容都讲完了。最后分享几个自己一直在用的路径小技巧,算不上什么高深操作,但对日常效率提升非常明显。
用cd -在长路径之间往返。在/etc/nginx/conf.d和/var/log/nginx之间来回切换时,cd -比任何方式都快。它的限制是只能记住上一次去的目录,对于“三个以上目录轮换”的场景不够用,可以配合pushd/popd管理目录栈,但大多数场景cd -就够了。
在脚本里常备“获取当前脚本所在目录”的固定代码。我在写几乎所有 shell 脚本时都会带上:
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR"这行代码的代价极小,但给脚本带来的鲁棒性提升非常大。从此脚本不管被谁调用、在哪里调用,都不会被工作目录绑架。
alias 简化高频跳转。对于经常访问的目录,在~/.bashrc里加几个别名,能省下大量重复输入:
alias nginxlog='cd /var/log/nginx' alias proj='cd /srv/websites/blog-2024/app/backend' alias ..='cd ..'最后说一下很多人忽视的:路径是 Linux 操作系统的“坐标系”,一切文件操作的本质都是路径操作。你花在理解目录结构和路径机制上的时间,会在所有后续的 Linux 使用中成倍放大。与其死记命令选项,不如先把路径这套坐标系建立起来,走到哪里都不会迷路。