使用perl脚本使用fmt调用cleartool命令

时间:2013-04-09 18:46:08

标签: perl clearcase

我使用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);

2 个答案:

答案 0 :(得分:0)

供参考,这是一个使用-fmt,“Finding the latest baseline for a component”的perl脚本:

实施例

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程序中重现。< / p>

答案 1 :(得分: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
---