PATH에 없는 CD 파일을 실행할 수 없습니다.

PATH에 없는 CD 파일을 실행할 수 없습니다.
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동일한 프로세스에서 하위 프로세스가 실행되므로 새 작업 디렉터리가 사용됩니다.

관련 정보