2009-02-20 8 views
13

¿Cómo puedo usar la sintaxis bash en el comando system() de Perl?¿Cómo puedo usar la sintaxis de bash en el sistema de Perl()?

Tengo un comando que es específico de bash, p. los siguientes, que utiliza la sustitución proceso de bash:

diff <(ls -l) <(ls -al) 

me gustaría llamarlo desde Perl, utilizando

system("diff <(ls -l) <(ls -al)") 

pero me da un error porque se trata de utilizar sh en lugar de bash para ejecutar el comando :

sh: -c: line 0: syntax error near unexpected token `(' 
sh: -c: line 0: `sort <(ls)' 

Respuesta

45

Dile a Perl que invoque bash directamente. Utilice la variante list de system() para reducir la complejidad de su cita:

my @args = ("bash", "-c", "diff <(ls -l) <(ls -al)"); 
system(@args); 

Usted puede incluso definir una subrutina si usted planea hacer esto con bastante frecuencia:

sub system_bash { 
    my @args = ("bash", "-c", shift); 
    system(@args); 
} 

system_bash('echo $SHELL'); 
system_bash('diff <(ls -l) <(ls -al)'); 
+1

+1 para usar la variante de lista –

+3

Esto también le impide invocar/bin/sh solo para ejecutar bash – cjm

+0

Estoy de acuerdo, la variante de lista es buena. – Frank

5
system("bash -c 'diff <(ls -l) <(ls -al)'") 

debería hacerlo, en teoría. La opción -c de Bash le permite pasar un comando de shell para ejecutar, según la página man.

4

El problema con las respuestas de vladr es que el sistema no capturará la salida en STDOUT del comando (que generalmente desearía), y tampoco permite ejecutar más de un comando (dado el uso de shift en lugar de acceder al contenido completo de @_).

algo como lo siguiente podría ser más adecuado para el problema:

my @cmd = ('diff <(ls -l) <(ls -al)', 'grep fu'); 
my @stdout = exec_cmd(@cmd); 
print join("\n", @stdout); 

sub exec_cmd 
{ 
    my $cmd_str = join(' | ', @_); 
    my @result = qx(bash -c '$cmd_str'); 
    die "Failed to exec $cmd_str: $!" unless($? == 0 && @result); 
    return @result; 
} 

Lamentablemente, esto no impedirá que se pueda invocar/bin/sh sólo para ejecutar fiesta, sin embargo, no veo una solución para este problema.

+0

¿Por qué esta respuesta no tiene más +1? – Mir

0

Prefiero ejecutar comandos bash en perl con patillas "` ". De esta manera puedo obtener un valor de retorno, por ejemplo .:

my $value = \`ls`; 

Además, no tiene que utilizar "fiesta -c" sólo para ejecutar un commmand. Funciona para mi.

0

Inspirado por la respuesta de @ errant.info, he creado algo más simple y trabajó para mí:

my $line="blastn -subject <(echo -e \"$seq1\") -query <(echo -e \"$seq2\") -outfmt 6"; 
my $result=qx(bash -c '$line'); 
print "$result\n"; 

La variable $ línea introducida permite modificar las entradas ($ seq1 y $ SEQ2) cada vez. Espero que ayude!

Cuestiones relacionadas