无法执行 cd 在 PATH 中找不到文件

无法执行 cd 在 PATH 中找不到文件
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/dirshell 代码,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在同一进程中执行该子进程,因此使用新的工作目录。

相关内容