子プロセスを使用しない同時ループ

子プロセスを使用しない同時ループ

同じプロセスで2つの同時タイマーを使用するスクリプトを作成しています。次の例では、5秒ごとにIPを出力しながら60秒ごとにIPアドレスを更新しようとしています。

while true; do
  ip=$(curl -4 -sf ifconfig.co)
  sleep 60
done &

while true; do
  echo $ip
  sleep 5
done

ここでの問題は、最初のループが子プロセスを生成するため、アドレス変数をwhile共有しないことです。ipただし、を削除すると、&スクリプトは2番目のループに入りません。

2つのループを1つに統合できますが、同じプロセスで2つのループを同時に実行するより良い方法があるかどうか疑問に思います。

ベストアンサー1

いいえ。bashこの方法の同時実行またはマルチスレッドはサポートされていません。サブシェルは変数を互いに通信しません。

FIFOまたは一時ファイルを使用して、あるサブシェルから別のサブシェルに情報を渡すことができます。

たとえば、次のようになります。

mkfifo hoppa

while true; do
  curl -4 -sf ifconfig.co >> hoppa
  sleep 60
done &

while : ; do
    read -t1 d <> hoppa
    if [ "$d" != "" ] ; then
        echo '+'
        ipread=$d
    else
        echo -n '.'
    fi
    echo $ipread
    sleep 5
done &

おすすめ記事