1. 首页 > Linux教程 > 正文

Linux教程FG049-pwd命令与当前路径查看/修改

本文档风哥主要介绍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

pwd命令核心功能:

  • 显示当前路径:打印当前工作目录的绝对路径
  • 物理路径:显示实际的物理路径(解析符号链接)
  • 逻辑路径:显示包含符号链接的逻辑路径
  • 脚本应用:在脚本中获取当前目录路径

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:显示版本信息
风哥提示:pwd命令虽然简单,但在脚本编写和路径处理中非常重要。理解物理路径和逻辑路径的区别对于处理符号链接至关重要。

Part02-生产环境规划与建议

2.1 pwd使用场景

# pwd常用场景

1. 确认当前目录
– 执行重要操作前确认位置
– 避免在错误的目录执行命令
– 脚本中记录执行位置

2. 脚本开发
– 获取脚本所在目录
– 构建相对路径
– 记录日志路径

3. 路径验证
– 验证目录切换是否成功
– 检查符号链接解析
– 确认工作环境

4. 日志记录
– 记录操作位置
– 故障排查时定位问题
– 审计追踪

5. 自动化任务
– 获取任务执行位置
– 构建动态路径
– 环境初始化

2.2 最佳实践建议

使用pwd命令的最佳实践: 学习交流加群风哥微信: itpux-com 更多学习教程公众号风哥教程itpux_com

  • 脚本中使用:在脚本开始时记录工作目录
  • 路径验证:重要操作前验证当前目录
  • 符号链接:明确使用-P或-L选项
  • 环境变量:使用$PWD变量提高效率
  • 错误处理:检查pwd命令执行结果

2.3 脚本中的应用

# pwd在脚本中的应用

# 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基础用法

# 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高级用法

# 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 实用案例

# pwd实用案例

# 案例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显示当前工作目录
  • 物理路径:pwd -P解析符号链接
  • 逻辑路径:pwd -L保留符号链接(默认)
  • 环境变量:$PWD和$OLDPWD
  • 脚本应用:获取脚本目录、构建路径、验证位置

5.2 常见问题解决

# pwd常见问题解决

# 问题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 实用技巧

# pwd实用技巧

# 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 .

风哥总结:pwd命令虽然简单,但在脚本开发和路径处理中非常重要。理解物理路径和逻辑路径的区别,掌握在脚本中正确获取路径的方法,可以避免很多路径相关的错误。建议在重要脚本中记录工作目录,便于故障排查和审计。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息