我收到以下
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 系统,而且适用于任何人都不应受制于的奇怪而特殊的操作系统(咳嗽,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 版本。
为防止出现问题,请使用-f
或--interactive=never
如果实施。见人 rm。