Убийство `сон `в подоболочке

У меня была такая же проблема. Мое решение состояло в том, чтобы активировать правило udev с ACTION=="bind"вместо ACTION=="add"(, потому что я видел с udevadm monitor, что это было последнее действие, когда я подключал мышь )

.
1
21.09.2021, 22:53
1 ответ

При использовании подстановки команд $(foo)оболочке необходимо дождаться получения всех входных данных от подстановки команд. Запускаемый вами sleepимеет копию файлового дескриптора (, вероятно, канала ), который подключен к тому месту, где оболочка считывает вывод подстановки команд. (Я также почти уверен, что $!даст PID оболочки, выполняющей цикл while, а не sleepвнутри него.)

Рассмотрим, например. этот скрипт:

foo() {
    sleep 5 &
    echo foo
}
tmp=$(foo)
echo end.

Запуск занимает 5 секунд.

Но измените строку sleepна sleep 5 > /dev/null &, и теперь скрипт немедленно возвращается, потому что sleepбольше не связан с подстановкой команды. Обратите внимание, что фоновый сон все еще будет работать там, в фоновом режиме, пока не истечет время ожидания. Вы просто вряд ли это заметите.

Обратите внимание, что это относится к подстановке команд , а не только к любой среде подоболочки.((foo)также будет подоболочкой, но здесь он должен работать аналогично { foo; }или просто foo.)

1
21.09.2021, 23:19

Теги

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