EmScript para alterar o diretório atual (cd, pwd) é mostrado como executar um script bash que altera o diretório do terminal.
Mas como executo um script perl que executa um script bash que altera o diretório do terminal?
Responder1
Você não pode.
O script Perl é executado em um processo filho da sua sessão shell. Este processo filho pode alterar seu próprio diretório de trabalho o quanto quiser, mas não pode alterar o diretório de trabalho de seu pai. Quando o script Perl é encerrado, o controle é retornado ao processo pai (a sessão shell), que permanecerá no mesmo diretório de trabalho o tempo todo, independentemente do que o processo filho fez enquanto estava em execução.
Responder2
Você não pode fazer issodiretamente. A única maneira de um shell alterar seu diretório atual é o próprio shell executar um cdcomando (ou pushd, popd, etc.).
Mas você pode fazer isso indiretamente. Aqui está um exemplo simples que altera o diretório atual para /tmp:
cd-tmp.pl:
#!/usr/bin/perl
print "cd /tmp\n";
No seu .bashrcou .bash_profile:
cd-tmp() { eval $(cd-tmp.pl); }
Isso pressupõe que cd-tmp.plesteja em um diretório no seu $PATH-- ou você pode especificar o caminho completo na função.
Quando você digita cd-tmpno prompt do shell, ele invoca cd-tmp.pl, captura sua saída e executa essa saída como um comando do shell.
Um script Perl não pode fazer com que um shell de chamada altere os diretórios, mas pode fornecer um comando que o próprio shell pode executar.
É claro que você pode usar um diretório diferente do /tmp, incluindo um que seja determinado com base em outras informações ou criado instantaneamente.
Um ponto de esclarecimento: o diretório atual é uma propriedade do processo shell atual, não do terminal.
ATUALIZAR :
Acabei de perceber que perdi parte da sua pergunta; você quer "um script perl que execute um script bash". É fácil modificar meu exemplo para fazer isso, mas não tenho ideiapor quevocê precisa do script Perl para executar um script bash. Você não nos contou o suficiente sobre o que está realmente tentando realizar.
Responder3
Existem várias maneiras (TIMTOWTDI) de execução de comandos externos do Perl. Como usar exec(), usar crases (``) etc. Se você pode executar os comandos externos diretamente do seu script Perl, acho que não há necessidade de chamar outro script Bash (mas você também pode fazer isso). Siga o link abaixo para saber mais. Observe também que quaisquer alterações feitas no programa afetam apenas o subshell e permanecem efetivas apenas em todo o programa, o que é sempre uma coisa boa, mas existem maneiras de tornar as alterações permanentes, ou seja, afetariam o shell pai também.
http://www.perlhowto.com/executing_external_commands
ATUALIZAR-
Algumas perguntas sobre "Como fazer de outras maneiras". Para requisitos incomuns, deveria haver soluções incomuns (que funcionem). Mas a questão é por que você usaria Perl para alterar o diretório shell pai? Veja como você faria isso de qualquer maneira
$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
Responder4
Mais uma solução é primeiro salvar o diretório que deseja visitar em uma variável string:
Ex:
$cd_path = "/var/tmp";
$cmd_to_run = "cd $cd_path ; ls -lrt";
system($cmd_to_run);


