Интерпретатор cmd использует for /F
для захвата и анализа выходных данных команды.См. for /?
в консоли cmd для получения полной информации.По сути, вы бы сделали что-то вроде этого:
@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) &") }'
Или чуть сложнее, вы можете обрабатывать в чистом bashбез зависимости от awk:
export LC_ALL=C
bash -c ./child1.sh | while IFS='' read -r line; do {
echo $line
[[ $line =~ "Test String" ]] && ./child2.sh &
}; done