2015-10-01 20 views
5

Sto cercando di scrivere un programma di utilità che passare attraverso un file che sarebbe simile a questa:Ottenere il codice e l'output di ritorno dal comando in Perl

# Directory | file name | action | # of days without modification to the file for the command to take action 
/work/test/|a*|delete|1 
/work/test/|b*|compress|0 
/work/test/|c*|compress|1 

Il mio script passerà attraverso il file di decidere se, per Ad esempio, ci sono file sotto/work/test/che iniziano con 'a' che non sono stati modificati negli ultimi 1 giorni e, in caso affermativo, li eliminerebbe.

Per questo, utilizzo il comando find. Esempio:

my $command = "find " . $values[0] . $values[1] . " -mtime +" . $values[3] . " -delete ;\n"; 
system ($command); 

Tuttavia, mi è stato chiesto di recuperare il codice di ritorno per ogni passaggio per verificare che ogni passaggio funzionasse correttamente.

Ora, so che system() restituisce il codice di ritorno e i backtick restituiscono l'output. Ma come posso ottenere entrambi?

+0

Vorrei usare [File :: Trova] (http://perldoc.perl.org/File/Find.html), [File :: Finder] (https://metacpan.org/pod/File :: Finder), [File :: Trova :: Regola] (https://metacpan.org/pod/File::Find::Rule), o simile invece di 'find'. Ciò ti permetterà di verificare il successo di ogni singolo 'unlink' invece del successo dell'intero comando' find'. – ThisSuitIsBlackNot

risposta

8

Dopo l'esecuzione dei backtick, il codice di ritorno è disponibile in $?.

$?

Lo stato restituito dall'ultima tubo di chiusura, comando backtick (``), chiamata riuscita a wait() o waitpid(), o dal sistema) dell'operatore (. Questa è solo la parola di stato a 16 bit restituita dalla tradizionale chiamata di sistema di attesa() di Unix (oppure creata per assomigliarla).

$output = `$some_command`; 
print "Output of $some_command was '$output'.\n"; 
print "Exit code of $some_command was $?\n"; 
+1

Suggerimento: tutti i file 'system',' readpipe' (backtick), 'wait' e' waitpid' set '$?'. – ikegami

+0

Nota anche - non sarà necessariamente il codice di ritorno del comando - potrebbe essere necessario spostarlo leggermente. – Sobrique

+0

La documentazione di 'system' mostra come aggiungere i diversi valori da' $? '. – ikegami

2

La soluzione universale per apici inversi, system(), ecc è quello di utilizzare la variabile ${^CHILD_ERROR_NATIVE}. Vedere la perldoc perlvar: http://perldoc.perl.org/perlvar.html#%24%7b%5eCHILD_ERROR_NATIVE%7d

$ {^ CHILD_ERROR_NATIVE} Lo stato nativo restituito dal l'ultimo tubo di chiusura, backtick (``) di comando, chiamata riuscita a wait() o waitpid(), oppure dal operatore di sistema(). Sui sistemi POSIX questo valore può essere decodificato con le funzioni WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WIFSTOPPED, WSTOPSIG e WIFCONTINUED fornite dal modulo POSIX.

+0

[Introdotto in perl 5.8.9] (https://metacpan.org/pod/perl589delta#New-internal-variables) – mob