Script Perl, faça cd no terminal

Script Perl, faça cd no terminal

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);

informação relacionada