批处理 - 如何在脚本中读取另一个命令行函数的输出?

gol*_*enk 3 phpunit batch-file

我是批处理脚本的新手,但是,之前我做过一些bash脚本.我的批处理文件将运行另一个程序(即phpunit),该程序将输出一些东西到命令提示符.我将如何让批处理脚本拦截已经输出的东西并根据它做出决定.例如,phpunit通常会打印一个'.' 对于每个成功运行的测试,每个测试失败的"F".如何让批处理脚本捕获此输出并根据它是否看到'.'来执行不同的操作.还是'F'?

Dar*_*ook 6

我首先回答你的实际问题,但这些建议可能对你想要解决的潜在问题有用:

  1. 您可以通过一种更容易让机器读取的方式获得phpunit日志结果.
  2. PHP是BASH用于编写命令行脚本的有效替代方法.我使用BASH来处理简单的东西,但是一旦它超出了几行,或者当我想添加循环,if语句等时,我决定在PHP中正确地完成它.其他人可能会达到perl或python.

在你的特定情况下,我会用PHP而不是BASH来做,因为它可能最终需要一些复杂的解析.但是让我们看看如何在BASH中做一些简单的事情.挑战是输出可能如下所示:

PHPUnit 3.4.5 by Sebastian Bergmann.

......................................

Time: 10 seconds, Memory: 9.00Mb

OK (38 tests, 660 assertions)
Run Code Online (Sandbox Code Playgroud)

或者看起来像这样:

PHPUnit 3.4.5 by Sebastian Bergmann.

............................................................  60 / 380
............................................................ 120 / 380
...............................................S............ 180 / 380
.......S.................................................... 240 / 380
............................................................ 300 / 380
............................................................ 360 / 380
....................

Time: 01:44, Memory: 14.50Mb

OK, but incomplete or skipped tests!
Tests: 380, Assertions: 6546, Skipped: 2.
Run Code Online (Sandbox Code Playgroud)

或者看起来像这样:

PHPUnit 3.4.5 by Sebastian Bergmann.

..IF

Time: 0 seconds, Memory: 8.00Mb

There was 1 failure:

1) MyTest::testTemp
Failed asserting that <boolean:false> is true.

/path/to/myTest.php:68

FAILURES!
Tests: 4, Assertions: 5, Failures: 1, Incomplete: 1.
Run Code Online (Sandbox Code Playgroud)

我猜你的应用程序就像是一个小时的cron工作,可以运行你所有的测试并确保没有任何破坏.所以我只想使用正则表达式来寻找"FAILURES"这个词:

#!/bin/bash

RESULT=`phpunit tests/myTest.php`

if [[ $RESULT =~ FAILURES ]]
then
    echo "Excuse me, Sir, but we have a problem in the unit tests...";echo "$RESULT"
fi
Run Code Online (Sandbox Code Playgroud)

我正在使用反引号来捕获输出.一些BASH专家会告诉你使用$().无论哪种方式在这里工作:

....
RESULT=$(phpunit tests/myTest.php)
...
Run Code Online (Sandbox Code Playgroud)