0

我需要在输入的特定时间对特定字符串进行 grep:

trap "kill 0" EXIT SIGINT SIGTERM
RESULT=$(adb logcat MyTag:V *:S | grep -m 1 "Hello World") &
sleep 10
if [ "$RESULT" = "" ]; then
    echo "Timeout!"
else
    echo "found"
fi

使用陷阱,子shell被正确杀死,但我看到grep现在不再工作了。adb logcat是执行脚本时在子shell中运行的唯一进程

4

2 回答 2

0

你能用$!(最后一个调用的进程的pid)杀死子shell吗

于 2013-08-07T09:34:49.717 回答
0

您可以使用进程替换打开文件描述符作为输入。n 秒后,您可以读取结果。

{
    sleep 10
    IFS= read -rd '' -u 4 RESULT
    if [ "$RESULT" = "" ]; then
        echo "Timeout!"
    else
        echo "found"
    fi
} 4< <(adb logcat MyTag:V *:S | grep -m 1 "Hello World")

您也可以使用exec它来保持它不只是在{}.

虽然我还是想知道为什么你必须将命令放在后台并使用 sleep 来等待它。它使用子 shell 运行,因此保存在 RESULT 中的值总是会丢失。

RESULT=$(adb logcat MyTag:V *:S | grep -m 1 "Hello World") &
sleep 10

RESULT=$(adb logcat MyTag:V *:S | grep -m 1 "Hello World")
于 2013-08-07T11:35:33.460 回答