【问题标题】:Perl system command not acting as a normal promptPerl 系统命令不充当正常提示符
【发布时间】:2011-03-28 01:23:11
【问题描述】:

我正在尝试修改 perl 脚本以注释掉所有匹配某种模式的行。在正常的命令提示符下,这是我要添加的行:

grep -lIRZ --exclude="*\.svn*" "pattern" . | xargs -0 -l sed -i -e 's/.*pattern.*/\/\/&/g'

这是在 perl 脚本的上下文中:

my $rmcmd = "grep -lIRZ --exclude=\"*\\.svn*\" \"pattern\" . | xargs -0 -l sed -i -e 's/.*pattern.*/\\/\\/&/g'";
runcmd($rmcmd);
...
sub runcmd {
    my @cmd = @_;
    print "Running: @cmd\n";
    system(@cmd);
    # Get  status from system
    my $ret = $? >> 8; 

    if ($ret) {  
        print "-E- command completed with error code $ret.\n"; 
        exit(1); 
    }
    return ($ret);
}

从命令提示符运行时一切正常,但运行相同命令的脚本总是崩溃。

有什么不同的地方,我该如何解决?

【问题讨论】:

  • (1) 请发布您得到的确切错误。 (2) 请打印并发布$rmcmd 的值——理想情况下,通过print 和Perl 调试器。 (3) 正确的解决方案是将整个复杂的管道重写为 Perl 代码。
  • (1)确切的错误是:-E- command completed with error code 1.
    (2)打印函数返回:grep -lIRZ --exclude="\ .svn" "dlclose" . | xargs -0 -l sed -i -e 's/.*dlclose.*/\/\/&/g'
    (3)我是perl新手,脚本中已经定义了runcmd。在 Perl 代码中管道的正确方法是什么?你能给我一些参考吗?
  • 你为什么不在 Perl 中做这一切?你让你的代码不可移植。
  • 这个 Perl 脚本已经存在并用于执行夜间构建。我只添加这一项操作。另外,runcmd 已经是我正在调用的现有脚本的一个函数。
  • 更好的问题是“我如何在 Perl 中编写这个?”

标签: linux perl scripting grep


【解决方案1】:

您的代码适用于我 - 在 Ubuntu 上使用 perl 5.10.1 - 在我重新插入 $rmcmd = .. 行末尾缺少的分号之后。

【讨论】:

  • 在 Ubuntu 上也适用于我。
猜你喜欢
  • 2014-03-18
  • 1970-01-01
  • 2013-06-25
  • 2019-01-03
  • 1970-01-01
  • 2013-06-12
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多