Есть ли способ выполнить две команды параллельно и получить ту, которая заканчивается первой?

#sh #dd

#sh #dd

Вопрос:

Я пытаюсь изменить код, найденный здесь 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>amp;1;
    echo $?
)

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

итак, если в js0 есть активность, она вернет 0.
Я хотел бы иметь что-то вроде

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

как только активность обнаружена на любом входе, она должна идти дальше, а не ждать, пока все задачи будут выполнены.

Ответ №1:

Запустите обе команды в фоновом режиме и используйте wait -n , чтобы дождаться завершения любой из них. (Избавьтесь от всего inputActive=$(...; echo $?) бизнеса. Это не дает ничего полезного.)

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

Если вы хотите проверить успешность, вы можете использовать wait непосредственно в if инструкции:

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

Кстати, вы могли бы использовать read вместо timeout и dd . read -N прочитает определенное количество символов и read -t установит тайм-аут.

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

Комментарии:

1. еще раз спасибо тебе, Джон. Мне удалось протестировать это и могу подтвердить, что это работает. Кроме второго варианта. В Raspbian при использовании read -N "$inputCount" -t "$inputWindow" < /dev/input/js0 amp; я получаю сообщение об ошибке -bash: read: read error: 0: Invalid argument , но, как я уже писал ранее, первый вариант соответствует моим потребностям :).

2. @AdamKiryluk Я получаю такое же сообщение об ошибке от bash, но оно работает с busybox ash. Однако в busybox отсутствует опция -n. zsh также не поддерживает ожидание. #Джонкугельман, у вас это все еще работает, какую оболочку (и версию) вы используете?