Script Perl, faça cd no terminal

3

Em Script 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?

    
por Hermann Ingjaldsson 17.07.2012 / 14:54

5 respostas

9

Você não pode.

O script Perl é executado em um processo que é filho da sua sessão do shell. Esse processo filho pode alterar seu próprio diretório de trabalho, mas ele não pode alterar o diretório de trabalho do pai. Quando o script Perl sai, o controle é retornado ao processo pai (a sessão do shell), que permanecerá no mesmo diretório de trabalho o tempo todo, independentemente do que o processo filho fez enquanto estava em execução.

    
por 17.07.2012 / 15:51
4

Você não pode fazer isso diretamente . A única maneira de um shell alterar seu diretório atual é o próprio shell executar um comando cd (ou pushd , popd , etc.).

Mas você pode fazer isso indiretamente. Aqui está um exemplo simples que muda o diretório atual para /tmp :

cd-tmp.pl:

#!/usr/bin/perl

print "cd /tmp\n";

No seu .bashrc ou .bash_profile :

cd-tmp() { eval $(cd-tmp.pl); }

Isso pressupõe que cd-tmp.pl esteja em um diretório no seu $PATH - ou você pode especificar o caminho completo na função.

Quando você digita cd-tmp em seu prompt de shell, ele invoca cd-tmp.pl , captura sua saída e executa essa saída como um comando shell.

Um script Perl não pode fazer com que um shell de chamada mude de diretório, mas pode fornecer um comando que o shell possa executar sozinho.

É claro que você pode usar um diretório diferente de /tmp , incluindo um que é determinado com base em outras informações ou criado na hora.

Um ponto de esclarecimento: o diretório atual é uma propriedade do processo shell atual, não do terminal.

ATUALIZAÇÃO:

Acabei de perceber que perdi parte da sua pergunta; você quer "um script perl que executa um script bash". É bastante fácil modificar meu exemplo para fazer isso, mas não tenho idéia por que você precisa do script Perl para executar um script bash. Você não nos contou quase o suficiente sobre o que você está realmente tentando realizar.

    
por 17.07.2012 / 21:06
0

Existem várias maneiras ( TIMTOWTDI ) de executar comandos externos a partir do Perl. Como usar exec() , usando backticks ('') etc. Se você pode executar os comandos externos diretamente do seu script Perl, então eu acho que não há necessidade de chamar outro script Bash (mas você pode fazer isso também). Siga o link abaixo para saber mais. Note também que qualquer alteração feita dentro do programa afeta apenas a subshell e permanece efetiva durante todo o programa, o que é sempre uma coisa boa, mas existem maneiras de tornar as mudanças permanentes, isto é, elas afetariam o shell pai também. / p>

link

UPDATE -

Algumas perguntas sobre "Como fazer de outras maneiras". Para requisitos incomuns, deve haver soluções incomuns (que funcionam). Mas a questão é por que você usaria o Perl para alterar o diretório shell do pai? Veja como você faria 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
    
por 17.07.2012 / 15:52
0

Você só pode fazer isso indiretamente, por exemplo, usando aliases. Ter seu script bash, em vez de mudar para o diretório desejado, basta imprimir o diretório desejado para stdout. O Perl deve capturar essa saída e também imprimir o diretório desejado para stdout. Um alias de shell ou função de shell pode então pegar essa saída e mudar o diretório dentro do shell em execução.

Um exemplo:

a.sh:

#!/bin/bash
mkdir /tmp/$$
echo /tmp/$$

b.pl:

#!/usr/bin/perl
my $something = do_somestuff();
print './a.sh $something';

sub do_somestuff{
     #do some processing here
     return "";
}

Use esta função de shell e teste-a:

daku@server:/home/daku $ b() { DIR='./b.pl'; if test -n "$DIR"; then cd "$DIR"; fi }
daku@server:/home/daku $ b
daku@server:/tmp/14397 $
    
por 17.07.2012 / 20:31
0

Mais uma solução é salvar primeiro o diretório que você deseja visitar em uma variável de string:
Por exemplo:

$cd_path = "/var/tmp";
$cmd_to_run = "cd $cd_path ; ls -lrt";
system($cmd_to_run);
    
por 07.01.2013 / 13:48