tutorial strawberry logo historia perl

strawberry - perl tutorial



¿Cuál es la diferencia entre los backticks, el sistema y el ejecutivo de Perl? (5)

exec

ejecuta un comando y nunca vuelve . Es como una declaración de return en una función.

Si el comando no se encuentra, exec devuelve falso. Nunca devuelve true, porque si se encuentra el comando nunca devuelve nada. Tampoco tiene sentido devolver el estado STDOUT , STDERR o exit del comando. Puede encontrar documentación al respecto en perlfunc , porque es una función.

sistema

ejecuta un comando y su secuencia de comandos Perl continúa una vez finalizado el comando.

El valor de retorno es el estado de salida del comando. Puedes encontrar documentación al respecto en perlfunc .

comillas traseras

Al igual que el system ejecuta un comando, su secuencia de comandos Perl continúa una vez finalizado el comando.

Al contrario que en el system el valor de retorno es STDOUT del comando. qx// es equivalente a backticks. Puede encontrar documentación al respecto en perlop , porque a diferencia de system y exec , es un operador.

Otras maneras

Lo que falta en lo anterior es una forma de ejecutar un comando de forma asíncrona. Eso significa que su script perl y su comando se ejecutan simultáneamente. Esto se puede lograr con open . Le permite leer STDOUT / STDERR y escribir a STDIN de su comando. Sin embargo, depende de la plataforma.

También hay varios módulos que pueden facilitar estas tareas. Hay IPC::Open2 e IPC::Open3 e IPC::Run , así como Win32::Process::Create si está en Windows.

¿Puede alguien ayudarme por favor? En Perl, ¿cuál es la diferencia entre:

exec "command";

y

system("command");

y

print `command`;

¿Hay otras formas de ejecutar comandos de shell también?


Permítanme citar los manuales primero:

perlfunc :

La función exec ejecuta un comando del sistema y nunca regresa : use el sistema en lugar de exec si desea que regrese

perlfunc :

Hace exactamente lo mismo que exec LIST, excepto que primero se realiza una bifurcación y el proceso principal espera a que se complete el proceso secundario.

A diferencia de exec y el sistema , los backticks no le dan el valor de retorno sino el STDOUT recopilado.

perldoc `String` :

Una cadena que es (posiblemente) interpolada y luego ejecutada como un comando del sistema con / bin / sh o su equivalente. Se honrarán comodines, tuberías y redirecciones de Shell. Se devuelve la salida estándar recopilada del comando ; error estándar no se ve afectado.

Alternativas:

En escenarios más complejos, donde desea obtener STDOUT, STDERR o el código de retorno, puede usar módulos estándar bien conocidos como IPC::Open2 e IPC::Open3 .

Ejemplo:

use IPC::Open2; my $pid = open2(/*CHLD_OUT, /*CHLD_IN, ''some'', ''cmd'', ''and'', ''args''); waitpid( $pid, 0 ); my $child_exit_status = $? >> 8;

Finalmente, IPC::Run from the CPAN también vale la pena mirar ...


¿Cuál es la diferencia entre los backticks de Perl ( ` ), system y exec ?

exec -> exec "command"; , system -> system("command"); and backticks -> print `command`;

exec

exec ejecuta un comando y nunca reanuda el script Perl. Es para un script como una declaración de return es para una función.

Si no se encuentra el comando, exec devuelve falso. Nunca devuelve true, porque si se encuentra el comando, nunca devuelve nada. Tampoco tiene sentido devolver el estado STDOUT , STDERR o exit del comando. Puede encontrar documentación al respecto en perlfunc , porque es una función.

P.ej:

#!/usr/bin/perl print "Need to start exec command"; my $data2 = exec(''ls''); print "Now END exec command"; print "Hello $data2/n/n";

En el código anterior, hay tres instrucciones de print , pero debido a que exec deja el script, solo se ejecuta la primera instrucción de impresión. Además, la salida del comando exec no se asigna a ninguna variable.

Aquí, solo está obteniendo la salida de la primera declaración de print y de ejecutar el comando ls en la salida estándar.

system

system ejecuta un comando y su secuencia de comandos Perl se reanuda una vez finalizado el comando. El valor de retorno es el estado de salida del comando. Puedes encontrar documentación al respecto en perlfunc .

P.ej:

#!/usr/bin/perl print "Need to start system command"; my $data2 = system(''ls''); print "Now END system command"; print "Hello $data2/n/n";

En el código anterior, hay tres declaraciones print . A medida que el script se reanuda después del comando del system , se ejecutan las tres instrucciones de impresión.

Además, el resultado del system ejecución se asigna a data2 , pero el valor asignado es 0 (el código de salida de ls ).

Aquí, está obteniendo la salida de la primera declaración de print , luego la del comando ls , seguida de las salidas de las dos declaraciones de print finales en estándar.

backticks ( ` )

Al igual que el system , al adjuntar un comando en backticks se ejecuta ese comando y su secuencia de comandos Perl se reanuda una vez que el comando finaliza. En contraste con el system , el valor de retorno es STDOUT del comando. qx// es equivalente a backticks. Puede encontrar documentación al respecto en perlop , porque a diferencia de sistema y exec , es un operador.

P.ej:

#!/usr/bin/perl print "Need to start backticks command"; my $data2 = `ls`; print "Now END system command"; print "Hello $data2/n/n";

En el código anterior, hay tres declaraciones print y las tres se están ejecutando. La salida de ls no se va a estandarizar directamente, sino que se asigna a la variable data2 y luego se imprime con la declaración de impresión final.


En general uso system , open , IPC::Open2 , o IPC::Open3 dependiendo de lo que quiera hacer. El operador qx// , aunque simple, es demasiado restrictivo en su funcionalidad para ser muy útil fuera de los hacks rápidos. Encuentro open a mucho más práctico.

perlfunc : ejecuta un comando y espera a que regrese

Utilice el system cuando desee ejecutar un comando, no se preocupe por su salida y no quiera que el script Perl haga nada hasta que el comando finalice.

#doesn''t spawn a shell, arguments are passed as they are system("command", "arg1", "arg2", "arg3");

o

#spawns a shell, arguments are interpreted by the shell, use only if you #want the shell to do globbing (e.g. *.txt) for you or you want to redirect #output system("command arg1 arg2 arg3");

qx// o `` : ejecuta un comando y captura su STDOUT

Use qx// cuando desee ejecutar un comando, capture lo que escribe en STDOUT y no desee que el script de Perl haga nada hasta que el comando finalice.

#arguments are always processed by the shell #in list context it returns the output as a list of lines my @lines = qx/command arg1 arg2 arg3/; #in scalar context it returns the output as one string my $output = qx/command arg1 arg2 arg3/;

perlfunc : reemplazar el proceso actual con otro proceso.

Utilice exec junto con la fork cuando desee ejecutar un comando, no se preocupe por su salida y no quiera esperar a que regrese. system es realmente justo

sub my_system { die "could not fork/n" unless defined(my $pid = fork); return waitpid $pid, 0 if $pid; #parent waits for child exec @_; #replace child with new process }

También puede leer los manuales de waitpid y perlipc .

open : ejecuta un proceso y crea un conducto a su STDIN o STDERR

Use open cuando desee escribir datos en STDIN de un proceso o leer datos de STDOUT de un proceso (pero no ambos al mismo tiempo).

#read from a gzip file as if it were a normal file open my $read_fh, "-|", "gzip", "-d", $filename or die "could not open $filename: $!"; #write to a gzip compressed file as if were a normal file open my $write_fh, "|-", "gzip", $filename or die "could not open $filename: $!";

IPC::Open2 : ejecute un proceso y cree una canalización para STDIN y STDOUT

Use IPC::Open2 cuando necesite leer y escribir en STDIN y STDOUT de un proceso.

use IPC::Open2; open2 my $out, my $in, "/usr/bin/bc" or die "could not run bc"; print $in "5+6/n"; my $answer = <$out>;

IPC::Open3 : ejecuta un proceso y crea un conducto para STDIN, STDOUT y STDERR

use IPC::Open3 cuando necesite capturar los tres manejadores de archivos estándar del proceso. Escribiría un ejemplo, pero funciona principalmente de la misma manera que IPC :: Open2, pero con un orden ligeramente diferente a los argumentos y un tercer identificador de archivo.


La diferencia entre ''exec'' y ''sistema'' es que exec reemplaza su programa actual con ''comando'' y NUNCA regresa a su programa. El sistema, por otro lado, bifurca y ejecuta el ''comando'' y le devuelve el estado de salida del ''comando'' cuando termina de ejecutarse. La marca de verificación atrasada ejecuta ''comando'' y luego devuelve una cadena que representa su salida estándar (lo que se habría impreso en la pantalla)

También puede usar popen para ejecutar comandos de shell y creo que hay un módulo de shell: ''usar shell'' que le brinda acceso transparente a los comandos de shell típicos.

Espero que te lo aclare.