2015-10-01 10 views
5

私はこのようになり、ファイルを通過しますユーティリティを書くことをしようとしている中で、コマンドからのリターンコードと出力を取得: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 

のために、かどうかの決定ファイルを通過します私のスクリプト例えば、/ work/test /の下に、最後の1日で修正されていない 'a'で始まるファイルがあります。もしそうなら、それらは削除されます。

このため、findコマンドを使用します。例:

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

しかし、すべてのステップが正常に機能することを確認するために、各ステップの戻りコードを取得するよう依頼されました。

ここで、system()は戻りコードを返し、バッククォートは出力を返します。しかし、どうすれば両方を得ることができますか?

+0

[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)、または 'find'の代わりに使用します。これにより、 'find'コマンド全体の成功の代わりに、個々の' unlink'の成功を確認することができます。 – ThisSuitIsBlackNot

答えて

8

バッククォートを実行した後の戻りコードは$?です。

$?

最後のパイプクローズ、バッククォート( ``)コマンド、(待つように成功したコール)またはwaitpidの()、またはシステムからの()オペレータによって返されるステータス。これは従来のUnixのwait()システムコールから返された16ビットのステータスワードに過ぎません(そうでなければ、そのように見えるようになっています)。

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

ヒント: 'system'、' readpipe'(backticks)、 'wait'と' waitpid'はすべて '$? 'を設定します。 – ikegami

+0

また、必ずしもコマンドのリターンコードである必要はありません。ビットシフトする必要があるかもしれません。 – Sobrique

+0

'system'のドキュメンテーションは、' $? 'から別の値をどのように追加するかを示しています。 – ikegami

2

バッククォートのための普遍的なソリューション、システム()、などが${^CHILD_ERROR_NATIVE}変数を使用することです。 http://perldoc.perl.org/perlvar.html#%24%7b%5eCHILD_ERROR_NATIVE%7d

$ {^} CHILD_ERROR_NATIVE 最後のパイプクローズによって返されたネイティブの状態、バッククォート( ``)コマンド、成功した呼び出しが待機する()またはwaitpidの()、またはから:はperlvarはperldocを参照してくださいsystem()演算子。 POSIXのようなシステムでは、この値は、POSIXモジュールによって提供されるWIFEXITED、WEXITSTATUS、WIFSIGNALED、WTERMSIG、WIFSTOPPED、WSTOPSIG、WIFOUNTINUEDの各関数でデコードできます。

+0

[perl 5.8.9で導入されました](https://metacpan.org/pod/perl589delta#New-internal-variables) – mob