在脚本执行过程中如何向shell进程发出信号?

时间:2018-06-26 00:30:19

标签: shell batch-file stdout

我看过的大多数控制台应用程序教程都具有写入控制台的概念。例如:

Could not build module: Foundation

我了解到,写入控制台基本上意味着写入stdout流,并且执行环境(即,node.js或C#的CLR)知道如何处理该标准输出=>将其写入终端屏幕情况。

使用基于终端的脚本语言(我实际上需要在C# => Console.WriteLine(...) node.js => console.log(...) ruby/python => print ... etc. etc. 脚本中执行此操作,但是我也想知道如何使用.bat脚本),如何保存标准输出一个子进程变成一个变量?因此,与此类似:

.sh

脚本1和脚本2是长时间运行的控制台应用程序。在启动脚本2之前,我需要等待一些数据缓存在脚本1中。

1 个答案:

答案 0 :(得分:3)

cmd解释器使用for /F捕获和解析命令的输出。有关完整详细信息,请参见cmd控制台中的for /?。基本上,您会执行以下操作:

@echo off & setlocal

for /f "usebackq delims=" %%I in (`cmd /c "child1.bat"`) do (
    echo(%%~I
    set "output=%%~I"
    setlocal enabledelayedexpansion

    rem # If !output! contains "Test String"...
    if not "!output!"=="!output:Test String=!" (

        rem # Do this to spawn child2.bat asynchronously
        start /b "" "child2.bat"

        rem # Or if you prefer child2.bat to block...
        rem # call "child2.bat"
    )
    endlocal
)

在.sh脚本(大概位于顶部的#!/bin/bash中)中,您可以更加轻松地将输出捕获到变量中。

output=$(command)
echo $output

但是我想那不是您真正想要的,因为echo $output直到command终止之前都不会触发,对吧?在那种情况下,也许您可​​以利用awk来监视command的输出,并在检测到适当的输出时生成一个进程?

# limit charset to optimize execution efficiency
export LC_ALL=C

bash -c ./child1.sh | awk '1;/Test String/ { system("(bash -c ./child2.sh) &") }'

或者稍微复杂一点,您可以在不依赖awk的情况下以纯bash进行处理:

export LC_ALL=C

bash -c ./child1.sh | while IFS='' read -r line; do {
    echo $line
    [[ $line =~ "Test String" ]] && ./child2.sh &
}; done