~ 안에현재 디렉토리를 변경하는 스크립트(cd, pwd) 터미널 디렉토리를 변경하는 bash 스크립트를 실행하는 방법이 표시됩니다.
하지만 터미널 디렉토리를 변경하는 bash 스크립트를 실행하는 Perl 스크립트를 어떻게 실행합니까?
답변1
당신은 할 수 없습니다.
Perl 스크립트는 쉘 세션의 하위 프로세스에서 실행됩니다. 이 자식 프로세스는 자신의 작업 디렉터리를 원하는 대로 변경할 수 있지만 부모의 작업 디렉터리는 변경할 수 없습니다. Perl 스크립트가 종료되면 제어권은 상위 프로세스(셸 세션)로 반환되며, 상위 프로세스(셸 세션)는 실행 중 하위 프로세스가 수행한 작업에 관계없이 전체 시간 동안 동일한 작업 디렉터리에 유지됩니다.
답변2
당신은 이것을 할 수 없습니다곧장. 쉘이 현재 디렉토리를 변경하는 유일한 방법은 쉘 자체가 cd명령(또는 pushd, popd등)을 실행하는 것입니다.
하지만 간접적으로 할 수도 있습니다. 다음은 현재 디렉터리를 다음으로 변경하는 간단한 예입니다 /tmp.
CD-tmp.pl:
#!/usr/bin/perl
print "cd /tmp\n";
귀하의 .bashrc또는 .bash_profile:
cd-tmp() { eval $(cd-tmp.pl); }
이는 -- 또는 함수에서 전체 경로를 지정할 수 있는 cd-tmp.pl디렉토리에 있다고 가정합니다.$PATH
cd-tmp셸 프롬프트에 입력하면 가 호출 cd-tmp.pl되어 출력을 캡처하고 해당 출력을 셸 명령으로 실행합니다.
Perl 스크립트는 호출 쉘이 디렉토리를 변경하도록 할 수 없지만 쉘이 자체적으로 실행할 수 있는 명령을 제공할 수 있습니다.
물론 /tmp다른 정보를 기반으로 결정되거나 즉석에서 생성된 디렉터리를 포함하여 이외의 디렉터리를 사용할 수도 있습니다.
한 가지 명확한 점은 현재 디렉토리는 터미널이 아닌 현재 쉘 프로세스의 속성입니다.
업데이트 :
방금 귀하의 질문 중 일부를 놓쳤다는 것을 깨달았습니다. "bash 스크립트를 실행하는 Perl 스크립트"를 원합니다. 그렇게 하기 위해 예제를 수정하는 것은 쉽지만 잘 모르겠습니다.왜bash 스크립트를 실행하려면 Perl 스크립트가 필요합니다. 실제로 달성하려는 작업에 대해 충분히 설명하지 않았습니다.
답변3
여러 가지 방법이 있습니다(팀토우디) Perl에서 외부 명령을 실행합니다. 을 사용하거나 백틱(``) 등을 사용하는 것과 같습니다 exec(). Perl 스크립트에서 바로 외부 명령을 실행할 수 있다면 다른 Bash 스크립트를 호출할 필요는 없다고 생각합니다(하지만 그렇게 할 수도 있습니다). 자세한 내용을 보려면 아래 링크를 따르세요. 또한 프로그램 내에서 이루어진 모든 변경 사항은 하위 쉘에만 영향을 미치고 프로그램 전체에만 적용됩니다. 이는 항상 좋은 일이지만 변경 사항을 영구적으로 적용할 수 있는 방법이 있습니다. 즉 상위 쉘에도 영향을 줍니다.
http://www.perlhowto.com/executing_external_commands
업데이트-
"다른 방법으로 수행하는 방법"에 대한 몇 가지 질문입니다. 특이한 요구 사항에 대해서는 (작동하는) 특이한 솔루션이 있어야 합니다. 그러나 문제는 왜 Perl을 사용하여 상위 쉘 디렉토리를 변경하겠습니까? 어쨌든 방법은 다음과 같습니다.
$cat test.pl
print "Hello world\n";
print "cd ..";
$pwd
/home/user/perlcode
$eval `perl test.pl|tee -a test.pl.log|grep cd`
$pwd
/home/user
답변4
또 다른 해결책은 먼저 방문하려는 디렉토리를 문자열 변수에 저장하는 것입니다.
예:
$cd_path = "/var/tmp";
$cmd_to_run = "cd $cd_path ; ls -lrt";
system($cmd_to_run);


