1

これは、結果を送信済みフォルダーに移動するための私のPerlコードです。

 system("mv /home/pi/downloads/$result /home/pi/downloads/sent/$result");

私が得るエラーは次のとおりです。

mv: missing destination file operand after `/home/pi/downloads/filename.txt'

私はここで何が間違っているのですか?

4

4 に答える 4

8

ほとんど$resultの場合、コマンドを途中で終了させる改行が含まれています。chomp余分な改行を破棄するために使用します。

ユーザー入力によるもので、むちゃくちゃになっていない場合$resultは、ほぼ確実に改行文字があります。また、プログラムの対象者によっては、悪意のあるコード インジェクションの問題が発生します。

インジェクション問題を回避するためにrename、ファイルを移動先に移動する機能を使用してみてはいかがでしょうか。

于 2013-01-15T00:29:46.053 に答える
5

それを言うのは難しいですが、それを解決するためにできることがいくつかあります。

まず、スクリプトが次のように開始することを確認します。

#!/pathe/to/perl -w

use strict;

警告を有効にする -w に注意してください。またuse strict、コードの問題を特定するのにも役立ちます。

非常に役立つもう 1 つの方法は、実行したいコマンドをスカラーに保存し、それを出力して実際に何をしているかを確認することです。

my $result = "filename.txt";
chomp($result);
my $cmd = sprintf("mv /home/pi/downloads/%s /home/pi/downloads/sent/%s", $result, $result);
print "$cmd\n";
system($cmd);

あなたのスクリプトでは、ユーザー入力から $result の値を取得していますか? 改行文字があるような気がします。chomp 関数は、文字列の末尾から安全に改行文字を削除します。

于 2013-01-15T00:25:29.110 に答える
3

system()またはを使用して外部プログラムを呼び出して何かを行うことができますがqx{}、Perl は非常に強力で用途が広く、多くの一般的な操作については、外部のものを使用せずに Perl 自体 (またはその多数のモジュール) だけを使用して実行できます。外部プログラムで問題が発生した場合、より高速で信頼性が高くなります。たとえば、外部実行可能ファイルにバグがあり、タイト ループでスピンしているsystem()場合、スクリプトがフリーズして返されない可能性があります。

あなたの場合、この Perl コードはより適切に機能し、エラーを処理します。

use File::Copy;

unless (move ("/home/pi/downloads/$result",
              "/home/pi/downloads/sent/$result"))
{
    print "Rename has failed!\n";
    # ...
}

(もちろん、$resultこれを実行する前に改行が含まれていないことを確認する必要があります。)

于 2013-01-15T02:35:09.527 に答える
1

両方$resultとディレクトリ自体を確認します。

  • スラッシュが$result含まれていないことを確認してください(サブディレクトリが必要な場合を除く)
  • コマンドは引用符を使用しないため、スペース$resultが含まれていないことを確認してください
  • $result空でないことを確認してください

ディレクトリの場合:

  • /home/pi/downloads存在し、ディレクトリであることを確認してください
  • /home/pi/downloads/sent存在し、ディレクトリであることを確認してください
  • /home/pi/downloads書き込み権限があることを確認してください
  • /home/pi/downloads/sent書き込み権限があることを確認してください

于 2013-01-15T00:30:42.450 に答える