2015-10-01 13 views
5

Próbuję napisać program narzędziowy, który będzie przejść przez pliku, który będzie wyglądać następująco:Pobierz kod zwrotny i wyjście z polecenia w 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 

Mój skrypt przejdzie akt decydujący, jeśli na na przykład, istnieją pliki w katalogu/work/test /, które zaczynają się od "a", które nie zostały zmodyfikowane w ciągu ostatnich 1 dni, a jeśli tak, to je usunie.

Do tego używam polecenia find. Przykład:

Ale zostałem poproszony o pobranie kodu powrotu dla każdego kroku, aby sprawdzić, czy każdy krok działał poprawnie.

Teraz wiem, że system() zwraca kod powrotu, a backticks zwracają dane wyjściowe. Ale jak mogę uzyskać oba?

+0

Chciałbym użyć [File :: Find] (http://perldoc.perl.org/File/Find.html), [File :: Finder] (https://metacpan.org/pod/File :: Finder), [File :: Find :: Rule] (https://metacpan.org/pod/File::Find::Rule) lub podobne zamiast 'find'. Umożliwi to sprawdzenie sukcesu każdego pojedynczego "odłączenia" zamiast sukcesu całego polecenia 'find'. – ThisSuitIsBlackNot

Odpowiedz

8

Po uruchomieniu numerów zwrotnych kod powrotu jest dostępny pod numerem $?.

$?

Status zwrócony przez ostatniego zamknięcia rury, komenda lewy apostrof (``), skuteczne wywołanie wait() lub waitpid(), lub z systemu() operator. Jest to tylko 16-bitowe słowo statusowe zwracane przez tradycyjne wywołanie systemowe wait() systemu uniksowego (lub w przeciwnym razie jest tak zaprojektowane).

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

Wskazówka: Wszystkie 'system',' readpipe' (cofnięcia), 'wait' i' waitpid' ustawiają '$?'. – ikegami

+0

Pamiętaj również - niekoniecznie będzie to kod powrotu polecenia - może być konieczne przesunięcie bitowe. – Sobrique

+0

Dokumentacja 'system' pokazuje, jak dodać różne wartości z' $? '. – ikegami

2

uniwersalne rozwiązanie backticks system() itd jest użycie zmiennej ${^CHILD_ERROR_NATIVE}. Zobacz perlvar perldoc: http://perldoc.perl.org/perlvar.html#%24%7b%5eCHILD_ERROR_NATIVE%7d

$ {^ CHILD_ERROR_NATIVE} Natywna stan zwracany przez ostatni rury końca, lewy apostrof (``) polecenia, udane wywołanie wait() lub waitpid() lub z operator system(). W systemach POSIX-owych ta wartość może być dekodowana za pomocą funkcji WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WIFOPOPED, WSTOPSIG i WIFCONTINUED dostarczanych przez moduł POSIX.

+0

[Wprowadzono w perlu 5.8.9] (https://metacpan.org/pod/perl589delta#New-internal-variables) – mob

Powiązane problemy