私は以下を受け取ります
yes: standard output: broken pipe
yes: write error
perlで次の行を実行すると
system("cd /tmp; yes | rm -r directory1 directory2 file3 > /dev/null 2>&1");
ファイルとディレクトリは引き続き削除されますが、メッセージは煩わしく、見たくないでしょう。
助けてくれてありがとう
Perl に関する質問ではありません。
エラーは から発生するyes
ため、 のエラー ストリームもリダイレクトする必要がありyes
ます。
... ; yes 2>/dev/null | rm -r ...
でも、忘れてyes
試してみrm -rf ...
ませんか?
あなたはPerlと言いますが、あなたの質問はUnix shellと言います。
Perl を使用する場合は、Perl で行います。
use File::Path qw(remove_tree);
use Cwd;
my $current_directory = getcwd();
chdir "tmp";
remove_tree("directory1", "directory2, "file3");
chdir $current_directory;
これは、コマンドと同じことを行いますsystem
。しかし、これは Unix システムだけでなく、誰にも影響されるべきではない奇妙で独特なオペレーティング システム ( Cough , Windows! Cough ) でも機能します。
また、誰かがエイリアスrm
コマンドを作成した場合や、独自のrm
コマンドを実装した場合でも機能します。コマンドを介してシェルアウトするときはいつでもsystem
、その素晴らしい安全な Perl 環境を離れて、オペレーティング システムの危険な領域に直接向かいます。さらに悪いことに、自分が使用しているシェルとは異なるシェルの手に命を委ねています。
モジュールFile::Pathは、Perl に付属する標準モジュールです。元のディレクトリを保存するために使用したCwdにも同じことが当てはまるので、コードの最後に戻ることができます。
ところで、おそらくそこでもいくつかのエラーチェックが必要になるでしょう:
use File::Path qw(remove_tree);
use Cwd;
my $current_directory = getcwd();
if chdir "tmp" {
remove_tree("directory1", "directory2, "file3");
chdir $current_directory;
}
else {
print "Whoops! I can't change to directory 'tmp'"
}
このように、remove_tree
実際に directory に変更した場合にのみ実行しますtmp
。
これが一時作業ディレクトリである場合。つまり、作成したので、ファイルを配置する場所ができました。 File::Tempモジュールを確認する必要があります。
File::Temp
(標準の Perl モジュールでもあります) は一時ディレクトリを作成し、それが一意であることを確認します。そのため、プログラムを同時に実行している他の誰かを踏みにじることはありません。さらに良いことに、それ自体もクリーンアップし、完了したらその一時ディレクトリを削除します。
use File::Temp;
my $temp_dir = File::Temp->newdir;
これで、すべての一時ファイルを$temp_dir
. プログラムが終了すると、一時ディレクトリとそこに配置したすべてのファイルが自動的に削除されます。
標準のPerl 関数の一部ではありませんが、これらのモジュールは Perl のディストリビューションの一部であり、いつでも利用できます。それらを使用しない理由はまったくないはずです。コマンドを使用している場合はsystem
、代わりに使用する必要がある標準の Perl モジュールがおそらくあります。
Perdocの Web ページで Perl モジュールのリストを参照します。使用している Perl のバージョンを必ず選択してください。
質問を防ぐには、実装されている場合は-f
orを使用--interactive=never
します。man rmを参照してください。