Perl은 바이너리 파일을 "실행"할 수 없습니다.

Perl은 바이너리 파일을 "실행"할 수 없습니다.

새로 Debin을 설치하면 Perl 해석기가 기본적으로 설치됩니다(즉, 아직 다른 Perl 패키지가 없습니다). 그러나 다음을 시도해 보십시오.

$ls
a.cpp b.cpp
$ perl -e 'system "g++ -o a.out a.cpp b.cpp"; exec "a.out"'

출력이 없습니다(오류 없음, 없음). Perl은 명령을 올바르게 사용하지만 system(즉, a.out실행 파일을 생성함) 분기할 수 없습니다. 왜?

답변1

대답은 거짓말선적 서류 비치exec하지만 자신이 찾고 있는 것이 무엇인지 모르면 확인하기가 어렵습니다.

LIST에 여러 매개변수가 있으면 execv가 호출됩니다.(3) LIST에 있는 매개변수를 사용합니다. LIST에 요소가 하나만 있는 경우 인수에 셸 메타 문자가 있는지 확인하고, 그렇다면 전체 인수가 구문 분석(...)을 위해 시스템의 명령 셸로 전달됩니다. 인수에 셸 메타 문자가 없으면 단어로 분할되어 execv에 직접 전달됩니다.(…).

모든 경우에 명령 이름은 (Perl 또는 쉘을 통해) 경로 조회 대상입니다. 해당 이름이 포함되어 있지 않으면 일반적으로 현재 디렉토리를 포함하지 않는 /명령 검색 경로( )에서 조회됩니다 .$PATH

로 변경

exec "./a.out"

답변2

...하지만 포크할 수는 없어요

exec전혀 분기하지 않고 현재 실행 중인 애플리케이션 코드(예: Perl)를 새 코드(a.out)로 바꿉니다.

그 외에도 어떤 출력이 예상되는지 명확하지 않습니다 a.out. 즉, 문제는 perl a.out이 아니라 perl에 있을 수 있습니다.

환경 변수가 명시적으로 포함되지 않았기 때문에 시스템이 a.out로컬 디렉터리에서 바이너리를 전혀 찾지 않을 수도 있습니다 . 이를 강제하려면 대신 수행하십시오.PATH.exec "./a.out"

관련 정보