其实有两个问题:
我正在通过我的 Perl 脚本创建一个 Subversion 标记。在创建该标签之前,我想查看该标签是否已经存在。我可以做到这一点的一种方法是运行svn ls $url
并查看命令是否失败:
my $error = system(svn ls $url);
if ( $error ) {
say qq(URL "$url" doesn't exist. Create that tag);
}
else {
say qq(Tag "$url" already exists. Abort! Abort!);
}
但是,STDERR
和STDOUT
都将被推送到终端。因此,我必须捕获输出并将其转储为空。在 Windows 中,它是NUL
. 在 Unix/Linux/Mac 中,它是/dev/null
:
use Config;
my $null;
if ( $Config{osname} =~ /Win(32|64)$/i ) {
say "This is a Windows system":
$null = 'NUL';
}
else {
say "This is Unix or Linux";
$null = '/dev/null';
}
my $command = qq(svn ls $url > $null 2>&1);
my $error = system $command;
if ( $error ) {
say qq(URL "$url" doesn't exist. Create that tag);
}
else {
say qq(Tag "$url" already exists. Abort! Abort!);
}
这行得通,但要查看 URL 是否存在似乎需要做很多工作。
问题2:有没有更好的方法来做到这一点?我知道在 Perl 中执行命令并查看命令是否失败的三种方法:
my $error = system $command
my $output = qx($command)
open my $fh, '-|', $command
在其中的每一个中,STDERR 都会打印到终端,并且必须被捕获。有没有办法执行命令,扔掉 STDERR 和/或 STDOUT 并只查看命令状态?
回答
鲍罗丁有一个好主意。重定向STDERR
到STDOUT
并使用qx/.../
. 我不必担心操作系统或NUL
vs. /dev/null
:
my $command = qq(svn ls $url 2>&1);
my $output = qx($command);
if ( $? ) {
say qq(URL "$url" doesn't exist. Create that tag);
}
else {
say qq(Tag "$url" already exists. Abort! Abort!);
}