在rm -r命令中输入yes时接收到奇怪的错误

时间:2013-02-20 17:37:52

标签: perl unix

我收到以下

yes: standard output: broken pipe
yes: write error 

在perl中执行以下行

system("cd /tmp; yes | rm -r directory1 directory2 file3 > /dev/null 2>&1");

文件和目录仍然被删除,但邮件很烦人,不希望看到它。

任何帮助谢谢

3 个答案:

答案 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