Error: process caused \"exec: \\\"cd\\\": executable file not found in $PATH\"\n"}
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
从哪里cd
执行?
答案1
cd
不是文件系统上的可执行命令(尽管 POSIX 兼容系统有一个),它是 shell 的内部内置命令,用于更改其当前工作目录。
进程无法在子进程中执行命令来更改其当前工作目录,因为当前工作目录是每个进程的属性。
无论您使用什么语言来尝试执行该cd
命令,都将有其自己的界面来更改当前工作目录。
例如,而不是:
spawn_cmd("cd", "/some/dir");
或者无论您使用什么命令来执行命令,在 C 语言中,请使用:
chdir("/some/dir")
chdir()
系统调用的libc接口在哪里chdir
?
请注意,如果在 C 语言中,您写道:
system("cd /some/dir");
那会不是输出一个错误,因为这实际上会做类似的事情:
spawn_cmd("sh", "-c", "cd /some/dir");
也就是说,运行一个壳在子进程中评估该cd /some/dir
shell 代码,shell 将调用其内置cd
命令来更改其自己的当前工作目录(但同样,不是生成进程来执行该命令的父进程的当前工作目录)。
但是,您可以这样做:
system("cd /some/dir && exec some-other-command");
与...一样:
spawn_cmd("sh", "-c", "cd /some/dir && exec some-other-command");
或者对于任意目录和命令,以避免它们被解释为 shell 代码的风险:
spawn_cmd("sh", "-c",
"unset -v CDPATH;"
"cd -P -- \"$1\" || exit;"
"shift;"
"exec \"$@\"", "sh", "/some/dir", "some-other-command");
然后,该子进程将执行sh
,这将更改其工作目录,然后some-other-command
在同一进程中执行该子进程,因此使用新的工作目录。