2010-10-04 5 views
7

En Unix, todos estos tres generan el mismo resultado¿Hay algún uso para proporcionar argumentos como parámetros separados a una llamada al sistema que usa Perl?

system("top -H -p $pid -n 1");    #ver1 
system("top", "H", "p $pid", "n 1");  #ver2 
system("top", "-H", "-p $pid", "-n 1"); #ver3 
  • ¿Cuál es la diferencia entre ver2 y ver3?

  • ¿Hay alguna razón por la que debería utilizar ver2 y ver3, y no ver1?

  • Ni siquiera admitir la canalización de los resultados, por ejemplo, ¿hay algún ver2 y ver3 equivalentes de la siguiente llamada?

    system("top -H -p $pid -n 1 | grep myprocess | wc -l"); 
    
+1

Ver también http://stackoverflow.com/questions/3854651/how-can-i-store-the-result-of-a-system-command-in-a-perl-variable por el mismo usuario –

+0

closevoter, esto no es un duplicado. Al menos lee las preguntas antes de marcar. @PP: ¿Quiso decir que era un duplicado? – Lazer

+1

No, mencioné el enlace porque las preguntas están relacionadas. –

Respuesta

5

Incluso Parece misma no es igual:

$ perl -e 'system("./test.pl -H -p $$ -n 1");system("./test.pl", "H", "p $$", "n 1");system("./test.pl", "-H", "-p $$", "-n 1");' 
-H,-p,10497,-n,1 
H,p 10497,n 1 
-H,-p 10497,-n 1 
$ cat ./test.pl 
#!/usr/bin/perl 
$\="\n"; 
$,=","; 
print @ARGV; 

Corresponde a top aplicación que funciona igual. Es posible que otras aplicaciones no funcionen igual.

3

Quoth perlfunc para system:

Tenga en cuenta que el procesamiento argumento varía en función del número de argumentos. Si hay más de un argumento en LIST, o si LIST es una matriz con más de un valor, inicia el programa dado por el primer elemento de la lista con argumentos dados por el resto de la lista. Si solo hay un argumento escalar, el argumento se verifica para los metacaracteres del shell, y si hay alguno, el argumento completo se pasa al shell de comandos del sistema para su análisis (esto es/bin/sh -c en las plataformas Unix, pero varía en otras plataformas). Si no hay metacaracteres de shell en el argumento, se divide en palabras y se pasa directamente a execvp, que es más eficiente.

Así que si $pid son sólo dígitos, todos son equivalentes.

Para interpolar los resultados de un comando de shell arbitrario, incluidos los tubos, use qx y sus amigos.

3

Como una razón práctica para usar LIST, a veces los argumentos de su línea de comandos contienen espacios u otros caracteres que podrían confundir su caparazón.

system("mplayer.exe", "--volume", "75", 
     q[C:/Program Files/My Music Player/Music Library/The "Music" Song.mp3]); 
1
  • ¿Cuál es la diferencia entre ver2 y ver3?

Simplemente en qué argumentos está pasando al top. No sé de una versión de top que tendrá interruptores sin guiones como algunas versiones de ps hacer, por lo que debe utilizar la versión 3.

  • ¿Hay alguna razón por la que debería utilizar ver2 y ver3, y no ver1 ?

Si pasa una sola cadena a system, la ejecutará a través de su caparazón. Esto significa que se interpretará en shell. Cualquier espacio callejero o metacaracteres (citas, signos de dólar, etc.) en los argumentos se interpretarían y posiblemente arruinarían las cosas. También es un potencial agujero de seguridad.

Por ejemplo, si $pid era algo así como '10; echo pwnd; echo ' entonces que había corrido top -H -p 10 continuación echo pwnd continuación echo -n1.

Por lo tanto, para la protección y la seguridad, a menos que necesite el procesamiento de la carcasa (consulte a continuación), debe pasar una lista al sistema.

  • ¿Hay algún equivalente en ver2 y ver3 que permita las tuberías?

No, la canalización y la redirección se realizan por el shell. Tienes que usar algo que no sea system. Puedes hacerlo con open, pero es un dolor en el trasero. La forma más fácil es usar IPC::Run.

use IPC::Run; 

my $out; 
run ["echo", "foo\nbar\nbaz"], "|", 
    ["grep", "ba"],   "|", 
    ["wc", "-l"], 
    \$out; 
print $out; # 2 

Pero en realidad si solo está desgranando y contando un puñado de líneas, use Perl.

my $out; 
run ["echo", "foo\nbar\nbaz"], '>', \$out; 

my $count = grep { /ba/ } split /\n/, $out; 
print $count; 
Cuestiones relacionadas