2010-10-04 13 views

Respuesta

40

De Perlfaq8:

Estás confundiendo el propósito de system() y backticks (``). system() ejecuta un comando y devuelve información de estado de salida (como un valor de 16 bits: los 7 bits bajos son la señal de la que murió el proceso, si existe, y los 8 bits altos son el valor de salida real). Backticks (``) ejecuta un comando y devuelve lo que envió a STDOUT.

$exit_status = system("mail-users"); 
    $output_string = `ls`; 

Existen muchas formas de ejecutar comandos externos desde Perl. La mayor cantidad de bienes comunes con sus significados son:

  • system(): desea ejecutar un comando y no desea capturar su salida
  • exec: no desea volver a la llamando al script de perl
  • backticks: desea capturar la salida del comando
  • open: que desea canalizar el comando (como entrada o salida) a la secuencia de comandos

Véase también How can I capture STDERR from an external command?

+0

gracias @Nikhil. – Lazer

9

La manera más fácil es usar la característica `` en Perl. Esto ejecutará lo que está dentro y devuelve aquello que fue impreso por la salida estándar:

my $pid = 5892; 
my $var = `top -H -p $pid -n 1 | grep myprocess | wc -l`; 
print "not = $var\n"; 

Esto debe hacerlo.

+0

son los $ pid la sustitución dentro de los backtics una nueva característica? No se puede hacer funcionar con 'v5.6.1'. – Lazer

+0

Esto ha funcionado por lo que puedo recordar. p. intente: 'perl -e '$ a =" Hola "; imprime \ 'echo $ a \' '' –

7

Trate de usar qx{command} en lugar de acentos abiertos. Para mí, es un poco mejor porque: puedes hacer SQL con él y no preocuparte por escapar de las comillas y demás. Dependiendo del editor y la pantalla, mis viejos ojos tienden a pasar por alto los pequeños tics de la espalda, y nunca debería haber un problema con la sobrecarga, como usar corchetes angulares versus glob.

+0

¡Gran respuesta! ¡Resolvió mi problema! – Alexey

2

Usando backtick o qx ayuda, gracias a todos por las respuestas. Sin embargo, descubrí que si usa backtick o qx, la salida contiene una nueva línea y debo eliminarla. Entonces usé chomp.

chomp($host = `hostname`); 
chomp($domain = `domainname`); 
$fqdn = $host.".".$domain; 

Más información aquí: http://irouble.blogspot.in/2011/04/perl-chomp-backticks.html

Cuestiones relacionadas