2010-10-04 15 views
7

Su Unix, tutti questi tre generano lo stesso risultatoC'è qualche uso nel fornire argomenti come parametri separati a una chiamata di sistema usando 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 
  • Qual è la differenza tra ver2 e ver3?

  • C'è qualche motivo dovrei usare ver2 e ver3, e non ver1?

  • Non hanno nemmeno supportano il piping dei risultati, ad esempio, ci sono ver2 e ver3 equivalenti del seguente chiamata?

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

Vedi anche http://stackoverflow.com/questions/3854651/how-can-i-store-the-result-of-a-system-command-in-a-perl-variable dalla stessa utente –

+0

closevoter, questo non è un duplicato. Almeno leggi le domande prima di segnare. @PP: intendevi dire che era un duplicato? – Lazer

+1

No, ho citato il link perché le domande sono correlate. –

risposta

5

Anche Sembra stesso non è lo stesso:

$ 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; 

Spetta a top applicazione che funziona lo stesso. Altre applicazioni potrebbero non funzionare allo stesso modo.

3

Quoth perlfunc per system:

noti che il trattamento degli argomenti varia a seconda del numero di argomenti. Se c'è più di un argomento in ELENCO, o se ELENCO è una matrice con più di un valore, avvia il programma dato dal primo elemento di l'elenco con argomenti forniti dal resto dell'elenco. Se c'è un solo argomento scalare, l'argomento viene controllato per i metacaratteri della shell e, se ce ne sono, l'intero argomento viene passato alla shell dei comandi del sistema per l'analisi (questo è/bin/sh -c sulle piattaforme Unix, ma varia su altre piattaforme). Se non ci sono metacaratteri della shell nell'argomento, è diviso in parole e passato direttamente a execvp, che è più efficiente.

Quindi se $pid è solo cifre, tutte sono equivalenti.

Per interpolare i risultati di un comando shell arbitrario che include le pipe utilizzare qx e gli amici.

3

Come motivazione pratica dell'utilizzo di ELENCO, a volte gli argomenti della riga di comando contengono spazi o altri caratteri che potrebbero confondere la shell.

system("mplayer.exe", "--volume", "75", 
     q[C:/Program Files/My Music Player/Music Library/The "Music" Song.mp3]); 
1
  • Qual è la differenza tra ver2 e ver3?

Proprio in quali argomenti si sta passando a top. Non so di una versione di top che avrà interruttori senza trattini, come alcune versioni di ps fare, così si dovrebbe utilizzare la versione 3.

  • C'è qualche motivo devo usare ver2 e ver3, e non ver1 ?

Se si passa una stringa singola a system, verrà eseguita tramite la shell. Ciò significa che sarà interpretato da shell. Qualsiasi spazio randagio o meta caratteri della shell (virgolette, segni del dollaro, ecc.) Negli argomenti verrebbero interpretati e probabilmente rovinerebbero le cose. È anche un potenziale buco di sicurezza.

Per esempio, se $pid era qualcosa di simile '10; echo pwnd; echo ' allora si sarebbe esegue top -H -p 10 quindi echo pwnd poi echo -n1.

Quindi, sia per la sicurezza che per la protezione, a meno che non sia necessaria l'elaborazione della shell (vedere di seguito) è necessario passare a un elenco di sistema.

  • Esistono equivalenti di ver2 e ver3 che consentono le condotte?

No, le connessioni e il reindirizzamento vengono eseguiti dalla shell. Devi usare qualcosa di diverso da system. Puoi farlo con open, ma è un rompicoglioni. Il modo più semplice è utilizzare IPC::Run.

use IPC::Run; 

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

Ma in realtà se si sta semplicemente facendo il grepping e contando una manciata di righe, utilizzare Perl.

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

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