0

我收到以下

yes: standard output: broken pipe
yes: write error 

在 perl 中执行以下行时

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

文件和目录仍会被删除,但该消息很烦人,不想看到它。

任何帮助谢谢

4

3 回答 3

2

不是真正的 Perl 问题。

错误来自yes,因此您也必须重定向 的错误流yes

... ; yes 2>/dev/null | rm -r ...

但是你为什么不忘记yes并尝试一下rm -rf ...呢?

于 2013-02-20T17:43:30.990 回答
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命令退出时,您就会离开那个安全的 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 网页中的 Perl 模块列表。只要确保您选择了您正在使用的 Perl 版本。

于 2013-02-20T18:39:48.177 回答
1

为防止出现问题,请使用-f--interactive=never如果实施。见人 rm

于 2013-02-20T17:42:26.903 回答