Зацикливание сценария оболочки без чтения

Похоже, вы не добавили пользователя, не являющегося -root, в список sudoers. Подробнее об этом см. man sudoers.

Что касается второго вопроса, вы уверены, что используете пароль пользователя root? В отличие от sudo, который запрашивает ваш пароль, suзапрашивает пароль пользователя, на которого вы переключаетесь.

0
02.09.2019, 06:29
1 ответ

Поскольку правая часть вашего конвейера evtest | read lineвыполняется в отдельной подоболочке (и, следовательно, никогда не устанавливает lineна что-либо полезное ), я ожидал, что ваш тест будет никогда не будет правдой, и что сценарий будет выполняться бесконечно. Может у вас в скрипте есть код, который вы не показываете?

В любом случае вам не нужно readиз evtest. Вместо этого вы можете использовать grep(, это также позаботится о «потенциальной проблеме», которую вы упомянули в конце ):

.
#!/bin/sh

exitCase='*type 1 (EV_KEY), code 57 (KEY_SPACE)*'

while true; do
    if evtest /dev/input/eventX | grep -q -Fx -e "$exitCase"; then
        echo caught event
        break
    else           
        echo loop doing stuff
    fi
done

Это прервет цикл, как только evtestсоздаст строку, точно такую ​​же, как $exitCase. Параметр -qдля grepговорит, что он должен быть тихим (нас интересует только статус выхода ), с помощью -Fмы убеждаемся, что grepсравнивает строку $exitCaseкак строка , а не как регулярное выражение, а с -xмы требуем, чтобы вся строка соответствовала (без подстрок, как если бы строка была привязана как в начале, так и в конце ).

Если вы хотите установить тайм-аут для grepили evtest, вы можете использовать timeoutиз GNU coreutils.

1
28.01.2020, 02:39

Теги

Похожие вопросы