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 호환 시스템에는)는 현재 작업 디렉토리를 변경하는 쉘의 내부 내장 명령입니다.
현재 작업 디렉터리는 프로세스별 속성이기 때문에 프로세스는 현재 작업 디렉터리를 변경하기 위해 하위 프로세스에서 명령을 실행할 수 없습니다.
명령 을 실행하기 위해 어떤 언어를 사용하든 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
셸 코드를 평가하면 셸은 내장 cd
명령을 호출하여 자체 현재 작업 디렉터리를 변경합니다(그러나 명령을 실행하기 위해 프로세스를 생성한 상위 프로세스의 현재 작업 디렉터리는 아님).
그러나 다음과 같이 할 수 있습니다.
system("cd /some/dir && exec some-other-command");
그것은 다음과 같습니다:
spawn_cmd("sh", "-c", "cd /some/dir && exec some-other-command");
또는 임의의 디렉토리 및 명령의 경우 쉘 코드로 해석될 위험을 방지하려면 다음을 수행하십시오.
spawn_cmd("sh", "-c",
"unset -v CDPATH;"
"cd -P -- \"$1\" || exit;"
"shift;"
"exec \"$@\"", "sh", "/some/dir", "some-other-command");
그런 다음 하위 프로세스가 실행되어 sh
작업 디렉터리가 변경된 다음 some-other-command
동일한 프로세스에서 하위 프로세스가 실행되므로 새 작업 디렉터리가 사용됩니다.