【问题标题】:How to determine if shell command didn't run or produced no output如何确定 shell 命令是否没有运行或没有输出
【发布时间】:2013-08-18 15:16:25
【问题描述】:

我正在通过 perl 脚本执行一些 shell 命令并捕获输出,就像这样,

$commandOutput = `cat /path/to/file | grep "some text"`;

我还检查命令是否成功运行,

if(!$commandOutput)
{
    # command not run!
}
else
{
    # further processing
}

这通常有效,我得到正确的输出。问题是,在某些情况下,命令本身不会产生任何输出。例如,有时我试图grep 的文本不会出现在目标文件中,因此不会提供任何输出。在这种情况下,我的脚本将其检测为“命令未运行”,但事实并非如此。

在 perl 中区分这两种情况的正确方法是什么?

【问题讨论】:

  • 您不应该使用 perl 来执行 cat 和 grep。 perl 可以轻松、快速、安全地做到这一点
  • 确实如此,但是还有很多perl没有替代品,所以我只是构建了一个通用系统来运行命令并获取输出,这些将由perl处理。
  • @Sibster:grep 在速度竞赛中轻松击败 Perl。可能是 2 倍或更多。
  • @Adrian,但是调用启动 shell 来执行 grep 很慢,所以我猜这取决于文件的数量和大小

标签: perl shell unix


【解决方案1】:

您可以使用它来了解命令是否失败或命令不返回任何内容

$val = `cat text.txt | grep -o '[0-9]*'`;    
print "command failed" if (!$?);    
print "empty string" if(! length($val) );    
print "val = $val";

假设 text.txt 包含“123ab”,您只想从中获取数字。

【讨论】:

    【解决方案2】:

    如果您不是通过管道发送到|grep,您可以查看$? 以了解更具体的退出状态,

    my $commandOutput = `grep "some text" /path/to/file`;
    
    if ($? < 0)
    {
        # command not run!
    }
    elsif ($? >> 8 > 1)
    {
       # file not found
    }
    else
    {
        # further processing
    }
    

    【讨论】:

      【解决方案3】:

      使用$?检查命令是否成功执行:示例见backticks do not return any value in perl

      【讨论】:

      • 由于我使用管道在命令中包含 grep,$?将返回grep 的结果对吗?
      猜你喜欢
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      相关资源
      最近更新 更多