私はこの目標を達成しようとしています。
while condition; do
var=value1
### update value every 5s
while sleep 5; do
var=value2
done
###
...
[ rest of code ]
done
ここでの問題は、スクリプトが常にループに入り、残りのコードをブロックすることです。
答え1
ある程度非同期変数の設定を達成するために試すことができるタスクは次のとおりです。
#!/usr/bin/env bash
async() {
while :; do
# send SIGUSR1 to "parent" script
kill -USR1 "$1"
sleep 1
done
}
# provide PID of script to async
async $$ &
async_pid=$!
declare -i i=0
update() {
i=42
}
cleanup() {
kill ${async_pid}
}
trap update USR1
trap cleanup EXIT
echo $i
sleep 2
echo $i
このアプローチの1つの注意点は、スクリプトがスリープモードであり、信号が放出されると、スクリプトがupdate
再び「復帰」したときにコマンドが一度だけ実行されることです。