我有一个程序调用chdir()来改变cwd。但是,在程序完成后,cwd会更改回调用程序的目录,而不是保留在调用chdir()指定的目录中。我创建了一个程序来测试chdir()是否实际更改到指定目录并发现chdir()正在执行我所假设的操作:在程序的持续时间内切换到指定的目录,然后返回到执行程序的目录。
以下是测试的代码:
#include <stdio.h>
#include <unistd.h>
#define NAME_MAX 100
int main(int argc, char **argv)
{
char buf[NAME_MAX];
char *path = argv[1];
if (chdir(path) == -1) { /* change cwd to path */
fprintf(stderr, "error: could not change to dir %s\n", path);
return 1;
}
getcwd(buf, NAME_MAX);
printf("CWD is: %s\n", buf); /* print cwd as obtained from getcwd() */
return 0;
}
这是我终端的输出:
john@ubuntu:~/C/cli$ pwd
/home/john/C/cli
john@ubuntu:~/C/cli$ mkdir foobar
john@ubuntu:~/C/cli$ ./test.c foobar
CWD is: /home/john/C/cli/foobar
john@ubuntu:~/C/cli$ pwd
/home/john/C/cli
所以我的问题是,在程序完成后,如何保留在chdir()调用中指定的目录?另外,我在Ubuntu 12.04上并使用gcc进行编译。
答案 0 :(得分:4)
某些信息(包括环境变量和当前工作目录的值)从父进程传播到子进程,但不传回父进程。如果子进程(您的程序)调用chdir
或设置或修改环境变量,则会影响该进程及其任何子进程,但不会影响父进程。
这就是为什么chdir
是shell中的内置命令; 不能作为单独的程序实现。
如果您想让程序更改shell的当前目录,则需要间接执行此操作。例如,您的程序可以打印cd
命令,您可以在shell中输出eval
。 (你可以将它包装在一个函数中。)
例如,如果您更改:
chdir(path);
到
printf("cd %s\n", path);
你可以有一个shell函数:
my_func() {
eval `your_program`
}
和my_func
将更改shell的当前目录。
或者您可以将cd
命令直接放在函数中,或者放在通过. script-name
或source script-name
执行的脚本中,而不是执行它。
所有这些解决方案都需要您当前的shell执行cd
命令本身(在内部调用chdir
系统调用)。
答案 1 :(得分:2)
另一个流程无法更改一个流程的环境。这包括当前的工作目录。所以不,你不能留在目录中。