dirname 是什么
dirname 从路径中取出目录部分,与 basename 正好相反。它的价值主要在脚本里:让自己能定位到脚本文件所在目录,从而正确读取同目录下的配置与资源,也常用于把配置项里的路径拆成目录段后再拼接。
基本信息
| 适用平台 | Linux / Unix,GNU coreutils 实现 |
|---|---|
| 命令语法 | dirname 路径... |
| 常用选项 | -z 以 NUL 分隔输出,便于处理含换行的路径 |
| 相关命令 | basename 取文件名、readlink -f 解析软链接后的绝对路径 |
典型使用场景
- 脚本内定位自身目录:cd "$(dirname "$0")" 是最常见的自举写法
- 拆分路径再拼接:从配置项中取出目录段后追加文件名,避免手工字符串切分
- 生成输出路径:把目标文件路径的目录段取出,作为同目录的输出位置
- 处理命令行参数:对用户传入的相对路径先规整出目录段再做校验
- 与 basename 配对:一个取目录一个取文件名,是路径处理的基础组合
常用示例
常用示例
dirname /etc/nginx/nginx.conf # /etc/nginx
dirname justfile # .(无目录段时输出点号)
dirname /var/log/ # /var(结尾斜杠被忽略)
cd "$(dirname "$0")" # 切到脚本自身所在目录
SELF=$(readlink -f "$0"); DIR=$(dirname "$SELF") # 先解析软链接再取目录
base=$(basename "$CONF"); dir=$(dirname "$CONF")输入输出对照
| 输入 | 输出 | 说明 |
|---|---|---|
| /etc/nginx/nginx.conf | /etc/nginx | 常规情况 |
| justfile | . | 无目录段时输出点号 |
| /var/log/ | /var | 结尾斜杠被忽略 |
| / | / | 根目录返回自身 |
| a/b | a | 相对路径按相对形式返回 |
输出为点号时含义是当前目录,脚本里直接 cd 进去会依赖调用位置,配合 readlink -f 先转绝对路径更稳。
dirname 只做字符串处理,既不检查路径是否存在,也不解析软链接,行为完全可预测。
需要同时处理多个路径时可以直接传入多个参数,输出顺序与输入参数一一对应,便于在循环里逐条消费。
用 $0 取脚本路径时,软链接调用与经 PATH 调用都可能给出非预期值,先 readlink -f 解析再 dirname。