Похоже, вы не добавили пользователя, не являющегося -root, в список sudoers
. Подробнее об этом см. man sudoers
.
Что касается второго вопроса, вы уверены, что используете пароль пользователя root
? В отличие от sudo
, который запрашивает ваш пароль, su
запрашивает пароль пользователя, на которого вы переключаетесь.
Поскольку правая часть вашего конвейера 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.