Відповіді:
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
Таким чином ваш сценарій продовжується, або ви відновите контроль негайно, тоді як починається нове фонове завдання сценарію з двома командами: сон та ехо.
Поширена помилка намагається дати або sleep
або echo
або обидва , &
які не будуть працювати належним чином . Запуск серії команд, ()
хоча породжує їх в окремому оболонковому процесі, який ви можете потім надіслати цілим у фоновий режим &
.
На ту дотепність, де я вважаю це активно корисним. У вбудованому пристрої я розробляю основний додаток, який працює з сторожовою собакою. Якщо це не вдається у такий спосіб, що викликає скидання сторожової служби незабаром після запуску, повторно, важко це виправити віддалено, оскільки період між запуском ОС і скиданням досить короткий, недостатньо, щоб схуднути і заблокувати запуск програми. Тому мені потрібен спосіб визначити систему, яка перезапустилася настільки швидко, і ввести затримку, якщо вона була, щоб дати час виправити її вручну.
[ -f /tmp/startdelay ] && sleep 30
touch /tmp/startdelay
( sleep 30 ; rm /tmp/startdelay ) &
[ -f /tmp/noautostart ] && exit 0
start_app
Якщо я ввійду та виконую touch /tmp/noautostart
основний додаток, програма не запуститься. Якщо сторож rm /tmp/startdelay
запустить, не буде виконано, і наступного разу, коли система запуститься, це дасть мені додаткові 30-ти років, щоб зупинити її. Інакше перезапуск буде швидким, без затримки.
&
щоб передати сон; "Ви також потребуєте заднього сну", - це було в першому рядку від початку. Якщо ви мені не вірите, подивіться історію редагування. І моя відповідь на 5 хвилин старша за твою: P
()
групою, оригінальна оболонка буде робити паузу до тих пір, поки породжена одна не закінчиться.)
використовувати at
команду
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
що буде працювати у фоновому режимі
echo
взагалі відмовитися , використовуючи гередок або єрестрі.
at
це стандартна команда POSIX. Яка система, схожа на Unix, не використовує її за замовчуванням?
Якщо ви хочете щось запустити за 5 хвилин, але решта програми продовжуватиметесь (або закінчите), вам також слід спробувати:
#!/bin/bash
runWithDelay () {
sleep $1;
shift;
"${@}";
}
runWithDelay 3 echo world &
echo hello
Це надрукується, hello
а потім через 3 секунди (після закінчення основної програми) надрукується world
.
Важлива частина полягає в тому, &
щоб вимкнути виконання функції на задній план.
runWithDelay () { sleep $1; "${@:2}"; }
замість цього запропонувати ?
doWhateverWithDelay 3 &
у вашому другому прикладі.
$@
є те, що ви можете його цитувати та буде розширено як список слів, що цитуються. Тож краще зробіть це "$@"
(або "${@}"
якщо вам подобаються брекети). Дивіться pastebin.com/MU7hbB2C
-n
), але, очевидно, це було трохи наївно.