2012-02-28 9 views
0

私は非常に奇妙なエラーが発生しています。Linuxコマンド(cp、rm)はperlスクリプトでは実行されません。いくつかの作品。しかし、エラーは返されません。

私はlinuxコマンドを実行するperlスクリプトを実行します。彼らはこのように実行されます。

my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1`; 
myLog("$err"); 

と$ errが返され、エラーではありませんでしたコマンドを意味している、空です。 (右?)

私はexec ""またはsystem()でlinuxコマンドを実行しようとしましたが、成功しませんでした。 パスを変更しようとしました。同じ。

また、私は新しいperlスクリプトでcpコマンドだけを実行しようとしました。できます。 私の完全なperlスクリプトではありません。

このperlスクリプトでは、コマンドの一部が動作しているものもあれば、動作していないものもあります。

スクリプトは昨日働いていた、今朝はもういない。その間に変更はありませんでした。

私は多くのことを試しましたが、誰かがアイデアを持っていればうれしいでしょう。

EDIT: サーバーには多くのプロセスが終了していませんでした。それらを清掃して問題を解決しました。 問題は別のアプリケーションに関連していますが、私はあなたのコメントのおかげでログを改善します。

+3

エラー報告がありません。スクリプトの先頭近くに 'use autodie qw(:all);'を追加すると、何か問題が発生したときに便利なエラーメッセージが表示され、中止されます。 – daxim

+1

'$ HTML'や' $ subpath'や '$ HTMLDIR1'変数の入力には十分に注意してください - もしそれらのどれかが[shell metacharacters](http://cwe.mitre.org/data /definitions/78.html)、あなたは安全でないツールを作成しました。シェルの使用を避けるために、['File :: Copy :: Recursive'](http://search.cpan.org/~dmuey/File-Copy-Recursive-0.38/Recursive.pm)または同様のツールを使用する方が良いでしょう完全に。 – sarnold

答えて

5

小さな問題:これをチェックあなたはSTDERRをキャプチャされませんので、あなたは、エラーが表示されません(あなたも$?リターンコードをチェックしていません)。

あなたはSTDOUTにSTDERRをリダイレクトする、またはコマンドを実行するためのモジュールのいずれかを使用する

my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1 2>&1`; 

を行う必要があります。


大問題:

あなたは、Perl-ネイティブモジュールが存在するためのPerlからシステムのコマンドを実行しないでください。この場合:File::Copy::Recursiveモジュール。

roll your ownディレクトリFile::Copyからコピーすることもできます。

1

バックチックを使用していますか? -vをcpコマンドに追加してSTDOUTに何かを見て、STDERRをSTDOUTにリダイレクトし、STDERRのエラーメッセージではなくcmdのexitcodeをチェックします。

実行直後にコマンド出力をプリントアウトするとどうなりますか?

my $err = `cp -rv $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1 2>&1`; 
my $exitcode = $? >> 8; 
warn "Output: $err\nexitcode: $exitcode\n"; 

qxを使用する方がよいでしょう。 http://www.perlmonks.org/?node_id=454715

+0

なぜあなたはqx //がより良いと思いますか? –

0

スペースを含む任意のシェル特殊文字を含む可能性のある引数を引用することもできます。シェルは与えられた文字列に単語分割を行いますので、$HTMLに空白が含まれている場合は、cpは予想以上に多くの引数を取得します。Perlはそのための非常に簡単なメカニズムを持っています:\Q\E

my $err = `cp -r \Q$HTML\E \Q/tssobe/www/tstweb/$subpath/$HTMLDIR1\E 2>&1`; 

英数字以外は、シェルに渡す前にバックスラッシュをエスケープします。そして、それらの変数に何があるかにかかわらず、正確に2つの引数をcpに提供します。

関連する問題