编写 pwd

程序思路:读取当前目录、一个目录接着一个目录地沿着树向上追踪,每步查看当前目录的i节点号,然后在父目录查找该i节点号的名字(目录名),直到到达目录树的顶端。


程序步骤:

    得到当前目录(.目录)的i节点号。(该 i节点号称为 n)

    切换到当前目录的父目录(..目录)。

    找到i节点号n链接的目录名。

重复以上步骤,直到达到目录树。

    判断是否到达目录树顶端(当 . 和 .. 的i节点相同时,就可以认为已经到达文件树的顶端)。

    关于目录名字的显示:

    第一种方法,建立一个循环,使用 strcat 或 sprintf 建立目录名字的字符串序列。

    第二种办法,通过一个递归的程序逐步到达树的顶端来一个接一个的显示目录名。


示例代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
// ino_t = unsigned long int
ino_t get_inode(char *);

void printpathto(ino_t);

void inum_to_name(ino_t , char *, int);

int main(){
    printpathto(get_inode("."));

    putchar('\n');
    return 0;
}

//打印以 this_inode  作为当前目录的绝对路径
void printpathto(ino_t this_inode){
    ino_t my_inode;
    char its_name[BUFSIZ];  //BUFSIZ = 8192
    if(get_inode("..") != this_inode){  // 判断是否到达文件的顶端
        chdir("..");    //改变工作目录,等同于  cd ..
        inum_to_name(this_inode,its_name,BUFSIZ);   //将 this_inode 转换成名字
        my_inode = get_inode(".");  //获取节点号
        printpathto(my_inode);  //递归调用(新的节点)
        printf("/%s",its_name); // 这个目录的名字(当目录为顶层目录才执行)
    }
}

// 将 inode_to_find i节点转换成对应文件名。
void inum_to_name(ino_t inode_to_find, char *namebuf, int buflen){
    DIR *dir_ptr;
    struct dirent *direntp;
    dir_ptr = opendir(".");
    if(dir_ptr == NULL){
        perror(".");
        exit(1);
    }
    while((direntp = readdir(dir_ptr)) != NULL)
        if(direntp->d_ino == inode_to_find){
            strncpy(namebuf,direntp->d_name,buflen);
            namebuf[buflen - 1] = '\0';
            closedir(dir_ptr);
            return ;
        }
        fprintf(stderr,"error looking for inum %ld\n",inode_to_find);
        exit(1);
}

//获取文件名对应的 i节点
ino_t get_inode(char *fname){
    struct stat info;
    if(stat(fname,&info) == -1){
        fprintf(stderr,"Cannot stat ");
        perror(fname);
        exit(1);
    }
    return info.st_ino;
}



<think>我们正在讨论的是Linux中的`pwd`命令,而不是之前提到的`su`命令。用户现在明确表示想了解和使用`pwd`命令。根据提供的引用,我们可以总结如下: 引用[1]:pwd命令用于快速确认当前所在目录,特别是在处理复杂的目录结构或符号链接时。 引用[2]:pwd全称为“Print Working Directory”,用于显示当前工作目录的绝对路径。 引用[3]:pwd是一个基础但重要的命令,功能是显示用户当前所在目录的绝对路径。 引用[4]:在终端操作时,当不确定当前位置时,使用pwd来显示当前目录在文件系统中的确切位置。 引用[5]:pwd命令有一些选项,如-L和-P,但在某些系统中可能只有部分选项有效。 因此,我们将围绕这些信息来回答用户的问题。 ### 功能概述 `pwd`(Print Working Directory)命令用于显示当前工作目录的绝对路径。当用户在终端中导航时,尤其是在目录结构复杂或使用符号链接的情况下,该命令能帮助用户明确当前所处的位置。 ### 基本用法 在终端中直接输入: ```bash pwd ``` 输出示例: ```bash /home/username/documents ``` ### 选项详解 根据引用[5],`pwd`命令有两个主要选项(尽管在某些系统中可能只有部分选项有效): 1. **-L (--logical)**:显示逻辑路径(即包含符号链接的路径)。 2. **-P (--physical)**:显示物理路径(即解析所有符号链接后的实际路径)。 #### 示例场景 假设我们有一个符号链接`mydocs`指向实际目录`/home/username/documents`: ```bash ln -s /home/username/documents mydocs cd mydocs ``` - 使用`pwd -L`(或默认行为): ```bash pwd -L ``` 输出:`/home/username/mydocs`(显示包含符号链接的路径) - 使用`pwd -P`: ```bash pwd -P ``` 输出:`/home/username/documents`(显示符号链接指向的实际路径) > **注意**:不同Linux发行版中选项支持可能不同。如CentOS 8中,`--logical`和`--physical`可能无效,而`-L`和`-P`有效(引用[5])。 ### 常见问题 1. **为什么需要`pwd`?** 在频繁切换目录后,用户可能忘记当前路径。`pwd`提供了快速定位方式[^4]。 2. **`pwd`与`echo $PWD`的区别?** `echo $PWD`是Shell内置变量,与`pwd -L`效果相同。但`pwd -P`可解析符号链接,而`$PWD`变量不会自动解析[^2]。 ### 进阶技巧 - **在脚本中使用**: 脚本中需要绝对路径时,常用`pwd`获取当前路径: ```bash #!/bin/bash CURRENT_DIR=$(pwd) echo "脚本运行于:$CURRENT_DIR" ``` - **结合符号链接**: 当目录包含符号链接时,使用`pwd -P`获取真实路径可避免路径混淆[^5]。 --- ### 原理图解 ```mermaid graph TD A[用户输入 pwd] --> B{是否带选项?} B -->|无选项| C[默认使用 -L 逻辑路径] B -->|-L| D[显示包含符号链接的路径] B -->|-P| E[解析所有符号链接显示物理路径] ``` > 💡 **关键机制**:`pwd`命令内部通过系统调用`getcwd()`获取当前目录路径。逻辑路径(-L)直接使用Shell维护的路径字符串,物理路径(-P)则逐级解析目录中的符号链接[^3]。 §§相关问题§§ 1. Linux中如何创建和管理符号链接? 2. 环境变量`$PWD`和`$OLDPWD`有哪些用途? 3. 如何在Shell脚本中安全地处理路径解析? 4. `pwd`命令在不同Unix-like系统(如macOS)中的行为差异?</think>### Linux `pwd` 命令详解 `pwd`(Print Working Directory)是 Linux 系统中**显示当前工作目录绝对路径**的基础命令。它在文件导航、脚本编写和系统管理中至关重要,特别在处理复杂目录结构时能快速定位位置[^1][^2][^3]。 --- #### 一、核心功能 1. **路径显示** 输出当前目录在文件系统中的完整绝对路径: ```bash $ pwd /home/user/projects/python-app # 输出示例 ``` 2. **符号链接处理** | 选项 | 作用 | 示例 | |------|------|------| | `-P` | 显示**物理路径**(解析所有符号链接) | `pwd -P` | | `-L` | 显示**逻辑路径**(保留符号链接,默认行为) | `pwd -L` | --- #### 二、使用场景与示例 1. **基础目录确认** ```bash $ cd /var/www/html $ pwd /var/www/html # 绝对路径输出 ``` 2. **处理符号链接** 假设 `/data` 是符号链接,指向 `/mnt/disk1`: ```bash $ cd /data $ pwd -L # 逻辑路径 /data # [^5] $ pwd -P # 物理路径 /mnt/disk1 # [^5] ``` 3. **脚本中获取当前路径** ```bash #!/bin/bash current_dir=$(pwd) echo "脚本运行目录: $current_dir" ``` --- #### 三、技术细节 1. **与 `$PWD` 变量的区别** - `pwd` 是独立命令 - `$PWD` 是 Shell 环境变量(等同于 `pwd -L`) ```bash $ echo $PWD # 输出同 pwd -L $ /bin/pwd -P # 强制使用物理路径[^5] ``` 2. **特殊目录处理** 在 `/proc` 虚拟文件系统中: ```bash $ cd /proc/self $ pwd /proc/self # 逻辑路径 $ pwd -P /proc/12345 # 实际进程ID路径 ``` --- #### 四、常见问题解决 1. **选项无效错误** 某些系统(如 CentOS 8)中 `--logical/--physical` 可能无效: ```bash $ pwd --logical # 可能报错 $ pwd -L # 使用短选项替代[^5] ``` 2. **路径混淆场景** 当目录包含空格或特殊字符时: ```bash $ cd "dir with spaces" $ pwd | xargs ls # 安全处理路径 ``` --- ### 原理图解 ```mermaid graph TD A[用户输入 pwd 命令] --> B{是否带选项?} B -->|无选项| C[默认使用 -L 逻辑路径] B -->|-L| D[返回含符号链接的路径] B -->|-P| E[解析所有符号链接] D & E --> F[输出绝对路径到终端] ``` > 💡 **关键机制**:`pwd` 通过内核系统调用 `getcwd()` 获取当前目录信息,其输出结果与 Shell 的目录栈管理直接相关[^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值