2

我使用 Perl 脚本在 ClearCase 上的多个 VOB 中为多个用户运行命令。我有一个从文本文件中读取的 VOB 列表。然后我在该列表上循环并执行我想要执行的任何 ClearCase 命令。但是,这一次脚本似乎不起作用。如果我将命令打印到屏幕上,然后在提示符处复制并粘贴它,它工作正常。它只是不会从 Perl 脚本中执行。我看到的唯一区别是 fmt 字符,但即使我删除它也不会执行。我尝试首先将 fmt 直接放在线上,然后尝试将它们设置为变量。你会看到第一个注释行是失败的,但我把它留在那里作为我尝试过的一个例子。最后两条评论来自我这样运行的另一个脚本,它确实有效。

代码:

#! /usr/local/bin/perl -w
use strict;

open(VOBS,"vobs.txt") || die "Can't open: !$\n";

my $u = '%u';
my $a ='%Ad';
my $n ='%N/n';
my $user='john';
my $ct = '/usr/atria/bin/cleartool';

while(my $newvobs=<VOBS>){

  chomp($newvobs);
  my $tag = $newvobs;
  print "\n $tag \n"; 
  print " $ct lstype -kind brtype -invob $tag | grep $user ";
  `$ct lstype -kind brtype -invob $tag | grep $user`;
  # `/usr/atria/bin/cleartool lstype -kind brtype -invob $tag -fmt '%u %Ad %N/\n' `;
  # print "\n cleartool rmtag -view  $tag \n";
  #`/usr/atria/bin/cleartool rmtag -view  $tag `;
}

close(VOBS);
4

2 回答 2

0

作为参考,这里有一个 perl 脚本,它使用-fmt查找组件的最新基线”:

例子:

ccperl StreamComp.pl mystream@\pvobtag | findstr {component}

脚本“ streamcomp.pl”:

#!/usr/bin/perl -w
my $cmdout = `cleartool desc -fmt '%[latest_bls]CXp' stream:$ARGV[0]`;
my @baselines = split(/,/,$cmdout);
foreach $baseline (@baselines)
{
  $compname=`cleartool desc -fmt '%[component]p' $baseline`;
  printf("%-30s \t %s\n", $compname, $baseline);
}

它是一个适用于 ClearCase UCM 环境的程序,但它可以让您了解grep可以尝试在您自己的基本 ClearCase 程序中重现的工作语句类型(无需先尝试)。

于 2013-04-09T19:16:02.553 回答
0

实际上您的程序运行,但不打印任何内容。

例子:

#!/usr/bin/perl
use strict;
use warnings;
my $cmd = "cat";
`$cmd $0 | grep warning`;

输出:(无)



最容易修复。最后一行

print `$cmd $0 | grep warning`

输出:


use warnings;
print `$cmd $0 | grep warning`;

如果您需要退出代码,请将最后一行替换为

my $exit = system("$cmd $0 | grep warning");
print $exit;

输出:


use warnings;
my $exit = system("$cmd $0 | grep warning");
0

或者使用 open 来处理输出:

open my $fh, "$cmd $0 | grep warning|" or die;
while (<$fh>) { print $_; }
close $fh;

输出:


use warnings;
open my $fh, "$cmd $0 | grep warning|" or die;

但我可以建议如下。使用 AUTOLOAD,clearcase 命令可以用作内部 perl 命令。

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

sub AUTOLOAD {
    (my $sub = $::AUTOLOAD) =~ s/.*:://;
    print "---\n";
    system("time $sub @_");
    print "---\n";
}

my $cmd = "cat";
eval "$cmd($0)";

输出:


---
#!/usr/bin/perl

use strict;
use warnings;

sub AUTOLOAD {
    (my $sub = $::AUTOLOAD) =~ s/.*:://;
    print "---\n";
    system("time $sub @_");
    print "---\n";
}

cat($0);
0.00user 0.00system 0:00.00elapsed 400%CPU (0avgtext+0avgdata 2112maxresident)k
0inputs+0outputs (0major+174minor)pagefaults 0swaps
---

于 2013-04-09T20:04:13.653 回答