これは、結果を送信済みフォルダーに移動するための私のPerlコードです。
system("mv /home/pi/downloads/$result /home/pi/downloads/sent/$result");
私が得るエラーは次のとおりです。
mv: missing destination file operand after `/home/pi/downloads/filename.txt'
私はここで何が間違っているのですか?
ほとんど$result
の場合、コマンドを途中で終了させる改行が含まれています。chomp
余分な改行を破棄するために使用します。
ユーザー入力によるもので、むちゃくちゃになっていない場合$result
は、ほぼ確実に改行文字があります。また、プログラムの対象者によっては、悪意のあるコード インジェクションの問題が発生します。
インジェクション問題を回避するためにrename
、ファイルを移動先に移動する機能を使用してみてはいかがでしょうか。
それを言うのは難しいですが、それを解決するためにできることがいくつかあります。
まず、スクリプトが次のように開始することを確認します。
#!/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 関数は、文字列の末尾から安全に改行文字を削除します。
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
これを実行する前に改行が含まれていないことを確認する必要があります。)
両方$result
とディレクトリ自体を確認します。
$result
含まれていないことを確認してください(サブディレクトリが必要な場合を除く)$result
が含まれていないことを確認してください$result
空でないことを確認してくださいディレクトリの場合:
/home/pi/downloads
存在し、ディレクトリであることを確認してください/home/pi/downloads/sent
存在し、ディレクトリであることを確認してください/home/pi/downloads
書き込み権限があることを確認してください/home/pi/downloads/sent
書き込み権限があることを確認してください