有没有办法并行执行两个命令并先结束?

Is there a way to execute two commands in parallel and get the that ends first?

我正在尝试修改此处找到的代码 https://retropie.org.uk/forum/topic/17924/detect-idle-state-power-off-screen 以便它可以同时监视两个 js 输入。我怎样才能做到这一点?

这部分我很纠结

inputActive=$(
    timeout ${inputWindow} \
        dd \
            if=/dev/inputs/js0 \
            of=/dev/null \
            count=${inputCount} \
            >/dev/null 2>&1;
    echo $?
)

if [ ${inputActive} -eq 0 ]; then

所以如果 js0 上有 activity 它将 return 0。 我想要类似

的东西
inputActive=$(
    (
        timeout ${inputWindow} \
            dd \
                if=/dev/inputs/js0 \
                of=/dev/null \
                count=${inputCount} \
                >/dev/null 2>&1;
        echo $?
    );
    (
        timeout ${inputWindow} \
            dd \
                if=/dev/inputs/js1 \
                of=/dev/null \
                count=${inputCount} \
                >/dev/null 2>&1;
        echo $?
    )
)

一旦在任何输入上发现 activity,它应该更进一步,而不是等到所有任务都完成。

运行 两个命令都在后台运行,并使用 wait -n 等待其中一个完成。 (摆脱整个 inputActive=$(...; echo $?) 业务。它没有做任何有用的事情。)

timeout "$inputWindow" dd if=/dev/inputs/js0 of=/dev/null count="$inputCount" &> /dev/null &
timeout "$inputWindow" dd if=/dev/inputs/js1 of=/dev/null count="$inputCount" &> /dev/null &
wait -n

如果要检查是否成功,可以直接在 if 语句中使用 wait

if wait -n; then
    echo "one of them succeeded"
else
    echo "one of them failed" >&2
fi

顺便说一下,您可以使用 read 代替 timeoutddread -N 将读取一定数量的字符并且 read -t 设置超时。

read -N "$inputCount" -t "$inputWindow" < /dev/inputs/js0 &
read -N "$inputCount" -t "$inputWindow" < /dev/inputs/js1 &
wait -n