У меня была такая же проблема. Мое решение состояло в том, чтобы активировать правило udev с ACTION=="bind"
вместо ACTION=="add"
(, потому что я видел с udevadm monitor
, что это было последнее действие, когда я подключал мышь )
При использовании подстановки команд $(foo)
оболочке необходимо дождаться получения всех входных данных от подстановки команд. Запускаемый вами sleep
имеет копию файлового дескриптора (, вероятно, канала ), который подключен к тому месту, где оболочка считывает вывод подстановки команд. (Я также почти уверен, что $!
даст PID оболочки, выполняющей цикл while
, а не sleep
внутри него.)
Рассмотрим, например. этот скрипт:
foo() {
sleep 5 &
echo foo
}
tmp=$(foo)
echo end.
Запуск занимает 5 секунд.
Но измените строку sleep
на sleep 5 > /dev/null &
, и теперь скрипт немедленно возвращается, потому что sleep
больше не связан с подстановкой команды. Обратите внимание, что фоновый сон все еще будет работать там, в фоновом режиме, пока не истечет время ожидания. Вы просто вряд ли это заметите.
Обратите внимание, что это относится к подстановке команд , а не только к любой среде подоболочки.((foo)
также будет подоболочкой, но здесь он должен работать аналогично { foo; }
или просто foo
.)