我看过的大多数控制台应用程序教程都具有写入控制台的概念。例如:
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中。
答案 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