在 WinCvs 中如何在当前工作目录之外执行命令?

How can you execute a command outside of your current working directory in WinCvs?

我正在开发 Perl 包装器以在 WinCvs 中执行命令。如果不对要执行命令的目录执行 chdir,我一直无法找到执行 Cvs 命令的方法。

这很烦人,因为这意味着每次我想在 perl 脚本中对 Cvs 做任何事情时,我都需要获取当前工作目录,将目录更改为 Cvs 路径,执行我的命令,然后更改目录回到原来的工作目录。

有没有办法将路径传递给 Cvs 命令,以便您可以在您当前不在的目录上发出命令?

例如,如果我在我的 Perl 脚本中的当前工作目录是 C:\test\ 并且我想在 C:\some_other_directory 上执行一个 Cvs update 命令,我如何在不执行的情况下执行该命令先 chdirC:\some_other_directory

我当前将如何执行命令的示例:

#!/usr/bin/perl
use strict;
use warnings;
use Cwd;

my $cwd = cwd();
chdir "C:\some_other_directory" or die $!;
system 'cvs update';
chdir $cwd or die $!;

我想要的是找到一种方法能够将 "C:\some_other_directory" 直接传递给 Cvs 命令并摆脱所有这些 chdir 废话...

另一种方法是在单个系统调用中调用多个命令:

system("cd C:\some_other_directory && cvs update");

Flavio 的答案有效,但我也找到了这个替代解决方案。它允许您更改目录以发出命令,但比使用 chdir 危险小,并且不太可能让您对脚本在任何给定时间可能位于哪个目录感到困惑。

模块File::Chdir可以很轻松的解决问题:

use File::Chdir;

# Set the current working directory
$CWD = '/foo/bar/baz';

# Locally scope this section
{
    local $CWD = '/some/other/directory';

    # Updates /some/other/directory
    system 'cvs update';
}

# current working directory is still /foo/bar/baz