我正在尝试在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);
答案 0 :(得分:2)
由于您不是非常具体地说明您进入程序的路径,我会尝试解释会发生什么:
如果发出类似cd
的shell命令,shell会解释命令行并将其拆分为未转义的空格。在您的示例中,您不希望它在Spring
和2016
之间拆分路径名,因此您可以逃离该空间。
换句话说,shell将您的/users/bayesianStudent/desktop/Spring\ 2016
转换为/users/bayesianStudent/desktop/Spring 2016
,这就是到达该计划的内容。
如果您在
中输入程序的路径printf("Please enter path:\n");
gets(path);
你没有逃脱,所以你必须按原样输入路径。
特别是,如果您输入/users/bayesianStudent/desktop/Spring\ 2016
,您的程序将会看到包含\
的字符串,并看到没有此类目录。