Come posso memorizzare il risultato di un comando di sistema in una variabile Perl?

$ cat test.pl my $pid = 5892; my $not = system("top -H -p $pid -n 1 | grep myprocess | wc -l"); print "not = $not\n"; $ perl test.pl 11 not = 0 $ 

Voglio catturare il risultato, ad esempio 11 in una variabile. Come lo posso fare?

Da Perlfaq8 :

Stai confondendo lo scopo di system () e backtick (“). system () esegue un comando e restituisce informazioni sullo stato di uscita (come valore a 16 bit: i 7 bit bassi sono il segnale a cui il processo è morto, se presente, e gli 8 bit alti sono il valore di uscita effettivo). Backticks (“) esegue un comando e restituisce ciò che ha inviato a STDOUT.

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

Esistono molti modi per eseguire comandi esterni da Perl. I più comuni con i loro significati sono:

  • system () : si desidera eseguire un comando e non si desidera catturarne l’output
  • exec : non vuoi tornare allo script perl di chiamata
  • backtick : vuoi catturare l’output del comando
  • open : si desidera redirect il comando (come input o output) al proprio script

Vedi anche Come posso catturare STDERR da un comando esterno?

Il modo più semplice è usare la funzione `` in Perl. Questo eseguirà ciò che è dentro e restituirà ciò che è stato stampato su stdout:

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

Questo dovrebbe farlo.

Prova a usare qx{command} piuttosto che i backtick. Per me, è un po ‘meglio perché: puoi fare SQL con esso e non preoccuparti di sfuggire citazioni e così via. A seconda dell’editor e dello schermo, i miei vecchi occhi tendono a perdere i piccoli battiti posteriori, e non dovrebbe mai avere un problema con il sovraccarico come usare le parentesi angolari rispetto a glob.

Usando backtick o qx aiuta, grazie a tutti per le risposte. Tuttavia, ho scoperto che se si utilizza backtick o qx , l’output contiene newline finale e ho bisogno di rimuoverlo. Quindi ho usato chomp .

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

Ulteriori informazioni qui: http://irouble.blogspot.in/2011/04/perl-chomp-backticks.html