pwd 默认等价于 pwd -p,输出物理路径;/bin/pwd 始终真实解析,而 shell 内建 pwd 依赖 $pwd 缓存,pwd -l 则仅输出逻辑路径;脚本中应始终用 pwd -p 或 /bin/pwd 获取可靠路径。

执行 pwd 时,它实际等价于 pwd -P,即始终解析并显示物理路径(跳过所有符号链接)。如果你在软链接目录里执行 pwd 却看到的是软链接路径(比如 /home/user/logs),那说明你的 shell 正在用环境变量 PWD 做缓存——这属于 shell 自己维护的逻辑路径,pwd 命令本身并不依赖它。
验证方式很简单:
- 进入一个软链接目录,比如
ln -s /var/log logs && cd logs - 运行
pwd和/bin/pwd对比:前者可能受 shell 缓存影响,后者是纯 POSIX 行为,强制走 -P - 再运行
pwd -L,它会无视物理结构,只输出$PWD的值(也就是你“以为”自己在哪)
很多人为了“保持路径显示一致”,在 ~/.bashrc 里加 alias pwd='pwd -L'。这看似方便,实则埋坑:
- 脚本中调用
pwd时行为突变,可能导致路径拼接错误(比如cp file $(pwd)/dest拿到的是逻辑路径,但目标不存在) -
cd -或子 shell 中的路径继承可能错乱 - 和
realpath .、readlink -f .等真正解析路径的命令结果不一致,调试时容易误判 - 团队协作或交接脚本时,别人默认 expect
pwd是物理路径,这个别名成了隐藏假设
真要简化,建议用新名字,比如 alias lwd='pwd -L'(logical working directory),不污染原语义。
在 shell 脚本开头写 SCRIPT_DIR=$PWD 是常见错误。因为 $PWD 是交互式 shell 维护的变量,脚本启动时它可能为空、过期,或被父进程污染。
可靠写法只有两种:
-
SCRIPT_DIR=$(pwd -P)—— 最简直接,推荐 -
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)—— 用于定位脚本自身所在目录(注意${BASH_SOURCE[0]}不是$0,后者可能被重命名或带路径)
别图省事写 SCRIPT_DIR=$(pwd),尤其当脚本可能被软链接调用时,pwd 和 pwd -P 差一个层级就可能让整个路径构造失败。
Bash/zsh 的 pwd 是内建命令,它优先读取并信任 $PWD 环境变量;而 /bin/pwd 是 GNU coreutils 提供的独立程序,完全绕过 shell 状态,每次调用都真实 getcwd() 系统调用。
这意味着:
- 在异常状态(如目录被删除、权限变更、挂载点消失)下,
pwd可能返回过期路径,/bin/pwd会报错或返回空 - 某些容器或 chroot 环境里,
/bin/pwd更可信,因为它不依赖 shell 初始化逻辑 - 写 Makefile 或跨 shell 兼容脚本时,显式调用
/bin/pwd可避免解释器差异
所以别把 pwd 当成“只是个打印路径的简单命令”——它的行为取决于你用的是哪个 pwd,以及你是否意识到 shell 正在悄悄帮你“记笔记”。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/279801.html