我收到以下
yes: standard output: broken pipe
yes: write error
在perl中执行以下行
system("cd /tmp; yes | rm -r directory1 directory2 file3 > /dev/null 2>&1");
文件和目录仍然被删除,但邮件很烦人,不希望看到它。
任何帮助谢谢
答案 0 :(得分:2)
不是真正的Perl问题。
错误来自yes
,因此您也必须重定向yes
的错误流。
... ; yes 2>/dev/null | rm -r ...
但为什么不忘记yes
并尝试rm -rf ...
?
答案 1 :(得分:2)
你说 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系统,也适用于无人应该受到的奇怪和特殊的操作系统(咳嗽,Windows!咳嗽)。
即使有人创建了别名rm
命令,或者已经实现了自己的rm
命令,它也会起作用。无论何时通过system
命令进行shell,都可以保留安全的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
,则只会执行tmp
。
如果这是您的临时工作目录。也就是说,您已经创建了它,因此您可以放置文件,您可能应该查看File::Temp模块。
File::Temp
(也是一个标准的Perl模块)可以为您创建临时目录,并确保它是唯一的,因此您不会踩踏其他同时运行程序的人。更好的是,它也将自行清理并在完成后删除该临时目录。
use File::Temp;
my $temp_dir = File::Temp->newdir;
现在,您可以将所有临时文件放入$temp_dir
。程序结束时,临时目录和放在那里的所有文件都会自动删除。
虽然不是标准 Perl函数的一部分,但这些模块是Perl发行版的一部分,并且始终可用。根本没有理由不使用它们。如果您正在使用system
命令,则可能需要使用标准的Perl模块。
浏览Perdoc Webpage中的Perl模块列表。只需确保选择您正在使用的Perl版本。
答案 2 :(得分:1)
要预防问题,请使用-f
或--interactive=never
(如果已实施)。请参阅man rm。