pwd 命令(Print Working Directory)是Linux和Unix系统中最基本、最常用的命令之一。它用于显示当前工作目录的完整绝对路径,帮助用户在复杂的目录结构中确定自己的位置。
pwd [选项]
pwd命令非常简单,不需要任何参数就可以使用。大多数情况下,直接输入pwd即可。
| 选项 | 说明 |
|---|---|
-L 或 --logical |
显示逻辑路径(包含符号链接解析后的路径) |
-P 或 --physical |
显示物理路径(不包含符号链接,显示实际路径) |
--help |
显示帮助信息 |
--version |
显示版本信息 |
# 最简单的用法:显示当前工作目录
pwd
输出示例:
/home/user/documents/projects
#!/bin/bash
# 在脚本中使用pwd保存当前目录
CURRENT_DIR=$(pwd)
echo "脚本从目录开始执行: $CURRENT_DIR"
# 进行一些目录操作
cd /tmp
echo "现在在: $(pwd)"
# 返回原目录
cd "$CURRENT_DIR"
echo "返回原目录: $(pwd)"
# 记录当前目录,切换后返回
original_dir=$(pwd)
echo "原始目录: $original_dir"
cd /var/log
echo "切换后目录: $(pwd)"
cd "$original_dir"
echo "返回后目录: $(pwd)"
# 创建一个符号链接
ln -s /home/user/documents /tmp/mydocs
# 切换到符号链接目录
cd /tmp/mydocs
# 显示逻辑路径(默认)
pwd -L
# 输出: /tmp/mydocs
# 显示物理路径
pwd -P
# 输出: /home/user/documents
# 默认行为(取决于系统,通常是-L)
pwd
# 通常输出: /tmp/mydocs
# 使用命令替换创建基于当前目录的文件
touch "$(pwd)/notes.txt"
# 在管道中使用pwd
echo "当前目录是: $(pwd)"
# 与find命令配合
find "$(pwd)" -name "*.txt" -type f
# 创建基于当前目录的备份
backup_file="backup_$(date +%Y%m%d)_$(basename $(pwd)).tar.gz"
tar -czf "$backup_file" .
# 如果目录名包含空格,pwd输出的路径需要正确处理
cd "/home/user/my documents"
# 正确的方法:使用引号包含pwd的输出
ls "$(pwd)"
# 或者在脚本中保存到变量
current_path=$(pwd)
ls "$current_path"
# 错误的方法:直接使用可能因空格而失败
ls $(pwd) # 如果路径有空格,这会被拆分为多个参数
# pwd可能是shell内置命令,也可能是外部命令
type pwd
# 输出: pwd is a shell builtin 或 pwd is /bin/pwd
# 环境变量PWD也存储当前目录
echo $PWD
# 比较内置命令和环境变量
echo "PWD环境变量: $PWD"
echo "pwd命令输出: $(pwd)"
# 在bash中,内置pwd通常与-L选项行为相同
pwd -L
echo $PWD
#!/bin/bash
# script_with_directory_management.sh
# 保存脚本开始时的目录
START_DIR=$(pwd)
echo "脚本开始于: $START_DIR"
# 切换到工作目录
WORK_DIR="/var/www/html"
cd "$WORK_DIR" || exit 1
echo "切换到工作目录: $(pwd)"
# 执行一些操作
echo "在工作目录中创建文件..."
touch index.html
# 返回起始目录
cd "$START_DIR"
echo "返回起始目录: $(pwd)"
#!/bin/bash
# find_relative_to_pwd.sh
# 使用pwd作为查找的基准目录
BASE_DIR=$(pwd)
echo "查找基准目录: $BASE_DIR"
# 查找所有PDF文件并记录完整路径
find "$BASE_DIR" -name "*.pdf" -type f | while read -r file; do
echo "找到PDF文件: $file"
# 可以进一步处理,如复制到特定目录
done
#!/bin/bash
# log_execution_path.sh
LOG_FILE="/var/log/myapp/execution.log"
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
EXECUTION_DIR=$(pwd)
# 记录执行时间和目录
echo "[$TIMESTAMP] 脚本在目录 $EXECUTION_DIR 中执行" >> "$LOG_FILE"
# 执行主要任务
echo "开始处理..."
# ... 任务代码 ...
# 记录完成
echo "[$(date "+%Y-%m-%d %H:%M:%S")] 处理完成" >> "$LOG_FILE"
# 创建一个实验环境
mkdir -p /tmp/real_dir
ln -s /tmp/real_dir /tmp/link_dir
# 切换到符号链接目录
cd /tmp/link_dir
# 不同选项的输出对比
echo "逻辑路径 (-L): $(pwd -L)" # 输出: /tmp/link_dir
echo "物理路径 (-P): $(pwd -P)" # 输出: /tmp/real_dir
echo "默认路径: $(pwd)" # 取决于shell配置
# 检查环境变量
echo "PWD环境变量: $PWD" # 通常是逻辑路径
echo "OLDPWD环境变量: $OLDPWD" # 上一个工作目录
-P选项获取物理路径"$(pwd)"/bin/pwd,行为可能略有不同# PWD - 当前工作目录(由shell维护)
echo "当前目录: $PWD"
# OLDPWD - 上一个工作目录(cd - 使用这个变量)
echo "上一个目录: $OLDPWD"
# HOME - 用户主目录
echo "主目录: $HOME"
# CDPATH - cd命令的搜索路径
export CDPATH=.:~:/etc
cd web # 如果当前目录没有web,会在CDPATH中查找
# 在脚本中使用这些变量
SCRIPT_DIR="$PWD"
echo "脚本所在目录: $SCRIPT_DIR"
# 1. pwd输出包含换行符
# 如果目录名包含换行符,pwd输出可能异常
# 可以使用printf或转义处理
printf "%s" "$(pwd)"
# 2. 目录被删除后pwd的行为
cd /tmp
mkdir testdir
cd testdir
rmdir ../testdir # 删除当前目录
pwd # 可能仍然显示被删除的目录路径
cd .. # 需要切换到其他目录
# 3. 权限问题
# 即使没有目录的读取权限,pwd仍然可以工作
sudo mkdir /root/restricted
sudo chmod 000 /root/restricted
cd /root/restricted # 需要root权限
pwd # 可以显示路径,但不能列出内容
# 4. 符号链接循环
ln -s /tmp/loop /tmp/loop # 创建符号链接循环
cd /tmp/loop
pwd # 可能陷入循环或显示错误
# 5. 不同shell的差异
# bash、zsh、dash等shell的pwd内置命令可能有细微差别
# 使用绝对路径调用外部命令确保一致性
/bin/pwd
# 1. 快速返回到特定目录
mark() {
export MARKED_DIR=$(pwd)
}
go_mark() {
cd "$MARKED_DIR"
}
# 使用: mark 标记目录,go_mark 返回
# 2. 创建基于当前目录的临时文件
tempfile=$(mktemp "$(pwd)/temp_XXXXXX")
echo "临时文件: $tempfile"
# 3. 在提示符中显示当前目录(PS1变量)
export PS1='\u@\h:\w\$ ' # \w显示当前目录
# 或者只显示最后一部分(目录名)
export PS1='\u@\h:\W\$ ' # \W显示当前目录名
# 4. 获取父目录的父目录
cd /usr/local/bin
echo "当前目录: $(pwd)"
echo "父目录: $(dirname "$(pwd)")"
echo "祖父目录: $(dirname "$(dirname "$(pwd)")")"
# 5. 比较两个pwd实现
builtin pwd # 使用shell内置命令
command pwd # 使用外部命令
虽然pwd命令非常简单,但在某些情况下仍需考虑性能:
$(pwd)可能影响性能,应保存到变量$(pwd)会创建子进程,在紧凑循环中可能影响性能$PWD变量通常比$(pwd)更快$(pwd)到变量,避免重复调用"$(pwd)"的输出pwd -P$PWD通常比命令替换更高效pwd命令有着悠久的历史和有趣的事实: