C语言开发自定义Shell时cd命令修改cwd后如何切回原始路径
方案说明
你提到的在初始化阶段存储原始工作目录到全局变量、需要时切回的方案完全可行,同时你现有代码的cd处理逻辑存在分支范围错误,需要同步修正,具体实现如下:
1. 存储初始工作目录
在程序初始化阶段通过getcwd()获取初始路径存入全局变量:
// 引入必要头文件 #include <unistd.h> #include <limits.h> // 定义全局变量存储初始工作目录 char origin_cwd[PATH_MAX]; // main函数初始化阶段执行 int main() { getcwd(origin_cwd, sizeof(origin_cwd)); // 其余初始化逻辑 return 0; }
2. 修复cd处理逻辑
你现有代码的if分支没有加大括号,导致无论第一次路径切换是否成功,都会执行/usr/bin下的切换操作,修正后的逻辑分两种场景适配:
场景1:cd仅做路径搜索,所有命令都使用初始工作目录
处理完cd逻辑后直接切回初始目录即可:
int commandHandler(char** parsed) { int ret; chdir("/usr"); ret = chdir(parsed[1]); if(ret != 0) { chdir("/usr/bin"); ret = chdir(parsed[1]); // 可选:如果切换失败可加perror输出错误信息 } // 切回初始工作目录 chdir(origin_cwd); return 0; }
场景2:cd需要永久切换shell工作目录,仅搜索路径时不影响全局
不需要实际切换目录做搜索,直接拼接路径判断目录是否存在即可,性能更优也不会意外修改全局工作目录:
#include <sys/stat.h> #include <stdio.h> int commandHandler(char** parsed) { char target_path[PATH_MAX]; struct stat st; // 优先判断/usr下是否存在目标目录 snprintf(target_path, sizeof(target_path), "/usr/%s", parsed[1]); if(stat(target_path, &st) == 0 && S_ISDIR(st.st_mode)) { chdir(target_path); return 0; } // 搜索失败再判断/usr/bin下的路径 snprintf(target_path, sizeof(target_path), "/usr/bin/%s", parsed[1]); if(stat(target_path, &st) == 0 && S_ISDIR(st.st_mode)) { chdir(target_path); return 0; } // 都不存在输出错误 perror("cd"); return -1; }
如果需要非cd命令强制使用初始目录,只需要在所有非cd命令的处理逻辑开头加一行chdir(origin_cwd)即可。
内容的提问来源于stack exchange,提问作者henryD
相关产品推荐
相关产品推荐

