You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:39:03