POSIX / C:chdir()没有用空格改变目录?

时间:2016-04-29 16:34:36

标签: c shell unix posix chdir

我正在尝试在Mac OS X上的C / POSIX中开发一个shell。对于cd命令,我可以在大多数情况下使用chdir方法成功更改shell的目录,除了当路径中有空格时。例如,路径如

/users/bayesianStudent/desktop

正确更改目录,但以下内容

/users/bayesianStudent/desktop/Spring\ 2016

返回错误消息:

No such file or directory

但是,如果我采用相同的路径并使用常规终端,它可以正常工作(因此路径没有任何问题)。以下是一个复制问题的虚拟程序:

#include    <stdio.h>
#include    <stdlib.h>

int main()
{
    char path[1024];
    char cwd[1024];

    printf("Please enter path:\n");
    gets(path);
    printf("Trying to change the path to %s\n", path );

    int i = chdir(path);
    if( i == 0 )
    {
        printf("sucess\n");
        if (getcwd(cwd, sizeof(cwd)) != NULL)
            fprintf(stdout, "Current working dir: %s\n", cwd);
        else
            perror("getcwd() error");
    }
    else
    {
        perror("Directory not changed: ");
    }
    return 0;
}

此外,由于我正在开发一个shell,我遇到了与使用ls等文件路径的其他命令相同的问题。例如,我收到类似的消息(当有空格但路径正确时):

execvp("ls", path, NULL);

1 个答案:

答案 0 :(得分:2)

由于您不是非常具体地说明您进入程序的路径,我会尝试解释会发生什么:

  1. 如果发出类似cd的shell命令,shell会解释命令行并将其拆分为未转义的空格。在您的示例中,您不希望它在Spring2016之间拆分路径名,因此您可以逃离该空间。

    换句话说,shell将您的/users/bayesianStudent/desktop/Spring\ 2016转换为/users/bayesianStudent/desktop/Spring 2016,这就是到达该计划的内容。

  2. 如果您在

    中输入程序的路径
    printf("Please enter path:\n");
    gets(path);
    

    你没有逃脱,所以你必须按原样输入路径。 特别是,如果您输入/users/bayesianStudent/desktop/Spring\ 2016,您的程序将会看到包含\的字符串,并看到没有此类目录。