我知道cd
是一个内置的shell,我可以使用system()
来运行它。
但有可能通过exec()
系列运行cd
命令,就像execvp()
?
编辑:我只是注意到, system("cd")
也没有意义。感谢大家的帮助。
exec
加载一个可执行文件并用它替换当前的程序映像。 正如你正确地指出, cd
不是一个可执行文件,而是一个shell内置。 所以你要运行的可执行文件是shell本身。 这当然是system()
为你做的,但是如果你想明确的说明,你可以使用exec
:
execl("/bin/sh", "-c", "cd", (const char *)0);
由于这取代了你当前的过程映像,你应该在fork()
一个新的进程之后做这个。
但是,这整个过程绝对没有影响。 如果要更改当前进程中的目录,请使用chdir()
。
你最好使用int chdir(const char *path);
在unistd.h
找到。
而正如已经说过的system("cd xxx")
不会改变你的应用程序当前目录,它并不是完全无用的。
您仍然可以使用系统退出状态来了解将当前目录更改为所指定的目录是否成功。
同样,如果你喜欢复杂的解决方案,你也可以使用fork / exec来执行相同的操作,或者使用/bin/sh -c cd xxx
或者使用提供独立cd
可执行文件的OS /bin/cd xxx
。
但是,我会推荐这个不过分的更快的等效access("xxx", X_OK|R_OK)
注意:所有POSIX兼容的操作系统必须提供独立的cd可执行文件。 Solaris , AIX ,HP-UX和Mac OS / X至少是这种情况。
不,它不是,它是没有用的。 chdir
(改变进程当前目录的函数)只影响调用它的进程(及其子进程)。 这并不影响其父母。
所以exec
cd
没有意义,因为进程在改变目录后会立即退出。
(如果你真的想要,你可以像bash -c cd /tmp
那样执行,但正如我所说的,这是徒劳无益的。)
当一个fork被完成时,环境变量CWD(当前工作目录)被子进程从父进程继承。如果fork和exec像往常一样完成,那么子进程调用chdir(),只是将目录更改为新目录并退出,这并不影响父母。因此,新的环境就会丢失。