존재하다현재 디렉터리를 변경하는 스크립트(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);