本文档风哥主要介绍Linux pwd命令的使用方法,包括当前路径查看、符号链接处理、路径验证等内容,参考Red Hat Enterprise Linux 10官方文档,适合运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
参考Red Hat Enterprise Linux 10官方文档中的System administration章节 from LinuxDBA视频:www.itpux.com
Part01-基础概念与理论知识
1.1 pwd命令基本概念
pwd(print working directory)命令用于显示当前工作目录的完整路径。 学习交流加群风哥QQ113257174
- 显示当前路径:打印当前工作目录的绝对路径
- 物理路径:显示实际的物理路径(解析符号链接)
- 逻辑路径:显示包含符号链接的逻辑路径
- 脚本应用:在脚本中获取当前目录路径
1.2 工作目录概念
1. 当前工作目录
– 用户当前所在的目录
– 所有相对路径都基于此目录解析
– 可以通过cd命令改变
2. 工作目录的作用
– 相对路径的基准点
– 文件操作的默认位置
– 命令执行的上下文环境
3. 查看工作目录的方法
pwd # pwd命令
echo $PWD # 环境变量
echo $OLDPWD # 上一个工作目录
ls -ld . # 列出当前目录
4. 工作目录相关环境变量
PWD – 当前工作目录
OLDPWD – 上一个工作目录
HOME – 用户家目录
1.3 pwd命令选项
pwd命令支持的选项:
- -P:显示物理路径,解析所有符号链接
- -L:显示逻辑路径,保留符号链接(默认)
- –help:显示帮助信息
- –version:显示版本信息
Part02-生产环境规划与建议
2.1 pwd使用场景
1. 确认当前目录
– 执行重要操作前确认位置
– 避免在错误的目录执行命令
– 脚本中记录执行位置
2. 脚本开发
– 获取脚本所在目录
– 构建相对路径
– 记录日志路径
3. 路径验证
– 验证目录切换是否成功
– 检查符号链接解析
– 确认工作环境
4. 日志记录
– 记录操作位置
– 故障排查时定位问题
– 审计追踪
5. 自动化任务
– 获取任务执行位置
– 构建动态路径
– 环境初始化
2.2 最佳实践建议
使用pwd命令的最佳实践: 学习交流加群风哥微信: itpux-com 更多学习教程公众号风哥教程itpux_com
- 脚本中使用:在脚本开始时记录工作目录
- 路径验证:重要操作前验证当前目录
- 符号链接:明确使用-P或-L选项
- 环境变量:使用$PWD变量提高效率
- 错误处理:检查pwd命令执行结果
2.3 脚本中的应用
# 1. 记录脚本执行位置
#!/bin/bash
SCRIPT_DIR=$(pwd)
# from:www.itpux.com.qq113257174.wx:itpux-com
echo “脚本执行目录: $SCRIPT_DIR”
# 2. 获取脚本所在目录
#!/bin/bash
SCRIPT_DIR=$(cd “$(dirname “$0″)” && pwd)
echo “脚本所在目录: $SCRIPT_DIR”
# 3. 保存和恢复工作目录
#!/bin/bash
ORIGINAL_DIR=$(pwd)
cd /tmp
# 执行操作
cd “$ORIGINAL_DIR”
# 4. 构建相对路径
#!/bin/bash
BASE_DIR=$(pwd)
CONFIG_FILE=”$BASE_DIR/config/app.conf”
LOG_FILE=”$BASE_DIR/logs/app.log”
# 5. 验证目录切换
#!/bin/bash
cd /var/log || {
echo “无法切换到/var/log”
exit 1
}
CURRENT_DIR=$(pwd)
if [ “$CURRENT_DIR” != “/var/log” ]; then
echo “目录切换失败”
exit 1
fi
Part03-生产环境项目实施方案
3.1 pwd基础用法
# 1. 显示当前工作目录
# pwd
/home/user
# 2. 使用环境变量
# echo $PWD
/home/user
# echo $OLDPWD
/var/log
# 3. 显示上一个工作目录
# cd –
/var/log
# pwd
/var/log
# 4. 在提示符中显示当前目录
# PS1='[\u@\h \W]\$ ‘
[user@gf-linux-server ~]$
# PS1='[\u@\h $(pwd)]\$ ‘
[user@gf-linux-server /home/user]$
# 5. 查看当前目录信息
# ls -ld $(pwd)
drwx——. 15 user user 4096 Apr 2 10:00 /home/user
# 6. 在find命令中使用
# find $(pwd) -name “*.txt”
/home/user/Documents/file1.txt
/home/user/Documents/file2.txt
# 7. 在tar命令中使用
# tar -czf backup.tar.gz -C $(pwd) .
3.2 pwd高级用法
# 1. 物理路径vs逻辑路径
# 创建符号链接
# ln -s /var/log /tmp/logs_link
# 切换到符号链接目录
# cd /tmp/logs_link
# pwd
/tmp/logs_link
# pwd -L(逻辑路径,默认)
# pwd -L
/tmp/logs_link
# pwd -P(物理路径)
# pwd -P
/var/log
# 2. 解析符号链接
# 当前在/tmp/logs_link
# pwd
/tmp/logs_link
# readlink命令解析
# readlink -f $(pwd)
/var/log
# realpath命令解析
# realpath $(pwd)
/var/log
# 3. 获取脚本真实路径
# cat > /tmp/test_script.sh << 'EOF'
#!/bin/bash
echo "当前工作目录: $(pwd)"
# from:www.itpux.com.qq113257174.wx:itpux-com
echo "脚本所在目录: $(cd "$(dirname "$0")" && pwd)"
echo "脚本真实路径: $(realpath "$0")"
EOF
# chmod +x /tmp/test_script.sh
# /tmp/test_script.sh
当前工作目录: /home/user
脚本所在目录: /tmp
脚本真实路径: /tmp/test_script.sh
# 4. 在循环中使用pwd
# for dir in /var/*/; do
cd "$dir" || continue
echo "当前目录: $(pwd)"
ls -lh | head -5
cd - > /dev/null
done
# 5. 比较物理路径和逻辑路径
# cd /tmp/logs_link
# if [ “$(pwd)” != “$(pwd -P)” ]; then
echo “当前目录是符号链接”
echo “逻辑路径: $(pwd)”
echo “物理路径: $(pwd -P)”
fi
当前目录是符号链接
逻辑路径: /tmp/logs_link
物理路径: /var/log
# 6. 获取父目录
# pwd
/home/user/Documents/Projects
# dirname $(pwd)
/home/user/Documents
# 获取多级父目录
# dirname $(dirname $(pwd))
/home/user
3.3 实用案例
# 案例1:创建基于当前目录的备份
# cat > /fgedu/shell/backup_here.sh << 'EOF'
#!/bin/bash
CURRENT_DIR=$(pwd)
# from:www.itpux.com.qq113257174.wx:itpux-com
BACKUP_DIR="/backup$(pwd)_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/backup.tar.gz" -C "$CURRENT_DIR" .
echo "备份完成: $BACKUP_DIR/backup.tar.gz"
EOF
# chmod +x /fgedu/shell/backup_here.sh
# cd /home/user/Documents
# backup_here.sh
备份完成: /backup/home/user/Documents_20260402_160000/backup.tar.gz
# 案例2:记录命令执行位置
# cat > /fgedu/shell/log_command.sh << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/command_audit.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
USER=$(whoami)
PWD=$(pwd)
echo "[$TIMESTAMP] $USER in $PWD: $@" >> $LOG_FILE
exec “$@”
EOF
# chmod +x /fgedu/shell/log_command.sh
# 案例3:验证工作目录
# cat > /fgedu/shell/check_directory.sh << 'EOF'
#!/bin/bash
EXPECTED_DIR="/var/log"
CURRENT_DIR=$(pwd)
if [ "$CURRENT_DIR" != "$EXPECTED_DIR" ]; then
echo "错误: 当前目录不是 $EXPECTED_DIR"
echo "当前目录: $CURRENT_DIR"
exit 1
fi
echo "目录验证通过: $CURRENT_DIR"
EOF
# chmod +x /fgedu/shell/check_directory.sh
# 案例4:获取相对路径
# cat > /fgedu/shell/relative_path.sh << 'EOF'
#!/bin/bash
TARGET=$1
CURRENT=$(pwd)
# 计算相对路径
python3 -c "import os.path; print(os.path.relpath('$TARGET', '$CURRENT'))"
EOF
# chmod +x /fgedu/shell/relative_path.sh
# cd /home/user
# relative_path.sh /var/log
../../var/log
Part04-生产案例与实战讲解
4.1 案例1:脚本路径处理
# 场景:编写一个需要在任何位置执行的脚本
# 1. 获取脚本所在目录
# cat > /opt/scripts/myapp.sh << 'EOF'
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# 方法1:使用dirname和pwd
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
echo "脚本目录: $SCRIPT_DIR"
# 方法2:使用readlink
SCRIPT_PATH=$(readlink -f "$0")
SCRIPT_DIR=$(dirname "$SCRIPT_PATH")
echo "脚本路径: $SCRIPT_PATH"
echo "脚本目录: $SCRIPT_DIR"
# 方法3:使用BASH_SOURCE
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
echo "BASH_SOURCE目录: $SCRIPT_DIR"
# 使用脚本目录构建其他路径
CONFIG_FILE="$SCRIPT_DIR/../config/app.conf"
LOG_FILE="$SCRIPT_DIR/../logs/app.log"
DATA_DIR="$SCRIPT_DIR/../data"
echo "配置文件: $CONFIG_FILE"
echo "日志文件: $LOG_FILE"
echo "数据目录: $DATA_DIR"
EOF
# chmod +x /opt/scripts/myapp.sh
# /opt/scripts/myapp.sh
脚本目录: /opt/scripts
脚本路径: /opt/scripts/myapp.sh
脚本目录: /opt/scripts
BASH_SOURCE目录: /opt/scripts
配置文件: /opt/scripts/../config/app.conf
日志文件: /opt/scripts/../logs/app.log
数据目录: /opt/scripts/../data
# 2. 处理符号链接脚本
# ln -s /opt/scripts/myapp.sh /fgedu/shell/myapp
# myapp
脚本目录: /opt/scripts
...
# 3. 保存和恢复工作目录
# cat > /tmp/test_dir_save.sh << 'EOF'
#!/bin/bash
# 保存当前工作目录
ORIGINAL_DIR=$(pwd)
echo "原始目录: $ORIGINAL_DIR"
# 切换到临时目录
cd /tmp
echo "当前目录: $(pwd)"
# 执行操作
ls -lh | head -5
# 恢复原始目录
cd "$ORIGINAL_DIR"
echo "恢复后目录: $(pwd)"
EOF
# chmod +x /tmp/test_dir_save.sh
# cd /home/user
# /tmp/test_dir_save.sh
原始目录: /home/user
当前目录: /tmp
total 8.0K
drwx------. 3 root root 4.0K Apr 2 10:00 systemd-private-abc123
drwx------. 3 root root 4.0K Apr 2 10:00 systemd-private-def456
-rw-------. 1 root root 0 Apr 2 10:00 yum.log
恢复后目录: /home/user
4.2 案例2:符号链接处理
# 场景:处理复杂的符号链接目录结构
# 1. 创建测试环境
# mkdir -p /data/app/current
# mkdir -p /data/app/releases/1.0
# mkdir -p /data/app/releases/2.0
# ln -sfn /data/app/releases/2.0 /data/app/current
# 2. 切换到符号链接目录
# cd /data/app/current
# pwd
/data/app/current
# pwd -P
/data/app/releases/2.0
# 3. 检测是否在符号链接中
# cat > /fgedu/shell/check_symlink.sh << 'EOF'
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
CURRENT_DIR=$(pwd)
PHYSICAL_DIR=$(pwd -P)
if [ "$CURRENT_DIR" != "$PHYSICAL_DIR" ]; then
echo "当前目录是符号链接"
echo "逻辑路径: $CURRENT_DIR"
echo "物理路径: $PHYSICAL_DIR"
echo "链接目标: $(readlink "$CURRENT_DIR")"
else
echo "当前目录是物理目录"
echo "路径: $CURRENT_DIR"
fi
EOF
# chmod +x /fgedu/shell/check_symlink.sh
# cd /data/app/current
# check_symlink.sh
当前目录是符号链接
逻辑路径: /data/app/current
物理路径: /data/app/releases/2.0
链接目标: /data/app/releases/2.0
# 4. 获取符号链接的真实路径
# cd /data/app/current
# realpath .
/data/app/releases/2.0
# readlink -f .
/data/app/releases/2.0
# 5. 遍历符号链接目录
# cat > /fgedu/shell/list_symlink.sh << 'EOF'
#!/bin/bash
DIR=$1
if [ -L "$DIR" ]; then
echo "目录 $DIR 是符号链接"
echo "链接目标: $(readlink "$DIR")"
echo "真实路径: $(readlink -f "$DIR")"
# 切换到物理目录
cd "$(readlink -f "$DIR")"
echo "物理目录内容:"
ls -lh
else
echo "目录 $DIR 不是符号链接"
fi
EOF
# chmod +x /fgedu/shell/list_symlink.sh
# list_symlink.sh /data/app/current
目录 /data/app/current 是符号链接
链接目标: /data/app/releases/2.0
真实路径: /data/app/releases/2.0
物理目录内容:
total 0
4.3 案例3:路径验证
# 场景:在执行关键操作前验证当前目录
# 1. 验证当前目录
# cat > /fgedu/shell/verify_directory.sh << 'EOF'
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
EXPECTED_DIR=$1
if [ -z "$EXPECTED_DIR" ]; then
echo "用法: $0 <期望目录>”
exit 1
fi
CURRENT_DIR=$(pwd)
if [ “$CURRENT_DIR” == “$EXPECTED_DIR” ]; then
echo “[OK] 当前目录正确: $CURRENT_DIR”
exit 0
else
echo “[ERROR] 当前目录不正确”
echo “期望目录: $EXPECTED_DIR”
echo “当前目录: $CURRENT_DIR”
exit 1
fi
EOF
# chmod +x /fgedu/shell/verify_directory.sh
# cd /var/log
# verify_directory.sh /var/log
[OK] 当前目录正确: /var/log
# verify_directory.sh /etc
[ERROR] 当前目录不正确
期望目录: /etc
当前目录: /var/log
# 2. 验证目录是否在指定路径下
# cat > /fgedu/shell/check_path.sh << 'EOF'
#!/bin/bash
REQUIRED_PATH=$1
if [ -z "$REQUIRED_PATH" ]; then
echo "用法: $0 <必需路径前缀>”
exit 1
fi
CURRENT_DIR=$(pwd)
if [[ “$CURRENT_DIR” == “$REQUIRED_PATH”* ]]; then
echo “[OK] 当前目录在 $REQUIRED_PATH 下”
echo “当前目录: $CURRENT_DIR”
exit 0
else
echo “[ERROR] 当前目录不在 $REQUIRED_PATH 下”
echo “当前目录: $CURRENT_DIR”
exit 1
fi
EOF
# chmod +x /fgedu/shell/check_path.sh
# cd /var/log/nginx
# check_path.sh /var
[OK] 当前目录在 /var 下
当前目录: /var/log/nginx
# check_path.sh /home
[ERROR] 当前目录不在 /home 下
当前目录: /var/log/nginx
# 3. 综合路径验证脚本
# cat > /fgedu/shell/path_validator.sh << 'EOF'
#!/bin/bash
CURRENT_DIR=$(pwd)
PHYSICAL_DIR=$(pwd -P)
echo "========================================="
echo "路径验证报告"
echo "========================================="
echo "时间: $(date)"
echo "用户: $(whoami)"
echo ""
echo "1. 当前工作目录"
echo " 逻辑路径: $CURRENT_DIR"
echo " 物理路径: $PHYSICAL_DIR"
if [ "$CURRENT_DIR" != "$PHYSICAL_DIR" ]; then
echo " [注意] 当前目录是符号链接"
echo " 链接目标: $(readlink "$CURRENT_DIR")"
fi
echo ""
echo "2. 目录权限"
ls -ld "$CURRENT_DIR" | awk '{print " 权限:", $1}'
ls -ld "$CURRENT_DIR" | awk '{print " 所有者:", $3":"$4}'
echo ""
echo "3. 磁盘使用"
df -h "$CURRENT_DIR" | tail -1 | awk '{print " 文件系统:", $1}'
df -h "$CURRENT_DIR" | tail -1 | awk '{print " 总容量:", $2}'
df -h "$CURRENT_DIR" | tail -1 | awk '{print " 已使用:", $3}'
df -h "$CURRENT_DIR" | tail -1 | awk '{print " 可用:", $4}'
df -h "$CURRENT_DIR" | tail -1 | awk '{print " 使用率:", $5}'
echo ""
echo "4. 目录内容统计"
FILE_COUNT=$(find "$CURRENT_DIR" -maxdepth 1 -type f | wc -l)
DIR_COUNT=$(find "$CURRENT_DIR" -maxdepth 1 -type d | wc -l)
echo " 文件数: $FILE_COUNT"
echo " 子目录数: $((DIR_COUNT - 1))"
echo ""
echo "========================================="
EOF
# chmod +x /fgedu/shell/path_validator.sh
# cd /var/log
# path_validator.sh
=========================================
路径验证报告
=========================================
时间: Fri Apr 2 16:30:00 CST 2026
用户: root
1. 当前工作目录
逻辑路径: /var/log
物理路径: /var/log
2. 目录权限
权限: drwxr-xr-x.
所有者: root:root
3. 磁盘使用
文件系统: /dev/mapper/rhel-root
总容量: 90G
已使用: 15G
可用: 75G
使用率: 17%
4. 目录内容统计
文件数: 45
子目录数: 12
=========================================
Part05-风哥经验总结与分享
5.1 pwd命令总结
- 基础用法:pwd显示当前工作目录
- 物理路径:pwd -P解析符号链接
- 逻辑路径:pwd -L保留符号链接(默认)
- 环境变量:$PWD和$OLDPWD
- 脚本应用:获取脚本目录、构建路径、验证位置
5.2 常见问题解决
# 问题1: pwd命令不存在
# 解决方法:
# 检查PATH环境变量
echo $PATH
# 使用绝对路径
/bin/pwd
# 问题2: 符号链接路径混淆
# 解决方法:
# 明确使用-P或-L选项
pwd -P # 物理路径
pwd -L # 逻辑路径
# 问题3: 脚本中获取错误路径
# 解决方法:
# 使用正确的方法获取脚本目录
SCRIPT_DIR=$(cd “$(dirname “$0″)” && pwd)
# 问题4: 目录被删除后pwd失败
# 解决方法:
# 检查目录是否存在
if [ -d “$(pwd)” ]; then
echo “目录存在”
else
echo “目录不存在”
fi
# 问题5: 权限不足
# 解决方法:
# 使用sudo
sudo pwd
# 或检查目录权限
ls -ld $(pwd)
5.3 实用技巧
# 1. 在提示符中显示完整路径
export PS1='[\u@\h:\w]\$ ‘
# 2. 快速复制当前路径
pwd | xclip -selection clipboard
# 3. 获取目录名和基名
basename $(pwd) # 当前目录名
dirname $(pwd) # 父目录路径
# 4. 比较两个目录
diff <(ls -la dir1) <(ls -la dir2)
# 5. 获取目录大小
du -sh $(pwd)
# 6. 查找当前目录下的文件
find $(pwd) -type f -name "*.log"
# 7. 在当前目录创建时间戳目录
mkdir "$(pwd)/$(date +%Y%m%d_%H%M%S)"
# 8. 获取当前目录的inode号
ls -id $(pwd)
# 9. 检查目录是否为空
if [ -z "$(ls -A $(pwd))" ]; then
echo "目录为空"
fi
# 10. 获取目录的绝对路径
realpath .
readlink -f .
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
