ループでスクリプトを継続的に実行し、変数が使用されるたびに最新の状態になるようにバックグラウンドで変数を更新しようとしています。ほぼ1時間の検索で何も見つかりませんでした。誰かが私より先にこれをやりたかったと思ったので、驚くべきことでした。
$SESSIONLENGTH
私のスクリプトはセッション長のフォーマットされた文字列に設定する必要があります...
#!/bin/bash
while true
do
SECONDSINSESSION=$SECONDS
SECONDSINMINUTE=60
SECONDSINHOUR=3600
SECONDSINDAY=86400
DAYSINSESSION=$(expr "$SECONDSINSESSION" / "$SECONDSINDAY")
DAY_REMAINDER=$(expr "$SECONDSINSESSION" % "$SECONDSINDAY")
HOURSINSESSION=$(expr "$DAY_REMAINDER" / "$SECONDSINHOUR")
HOUR_REMAINDER=$(expr "$DAY_REMAINDER" % "$SECONDSINHOUR")
MINUTESINSESSION=$(expr "$HOUR_REMAINDER" / "$SECONDSINMINUTE")
SECONDSINSESSION=$(expr "$HOUR_REMAINDER" % "$SECONDSINMINUTE")
SESSIONLENGTH="$DAYSINSESSION days, $HOURSINSESSION hours, $MINUTESINSESSION minutes, and $SECONDSINSESSION seconds."
sleep 1
done &
したがって、実行中であることを確認してjobs
使用すると、echo $SESSIONLENGTH
値が更新されないか、まったく存在しません。
誰でも助けることができますか?
source
クイック編集:このスクリプトでは.
。
ベストアンサー1
OPの問題を解決したら、問題を説明して解決策を選択する必要があると思いました。
基本スクリプトを作成したら、source
関数(またはそのエイリアス)を使用して.
テストします。この場合、スクリプトは正常に実行されます。シェル変数がシェルプロセス内にあるので動作します。
バックグラウンドプロセスとして実行(または単にコマンドとして呼び出される)すると、スクリプトはシェルプロセスから分岐した別のプロセスとして実行されます。シェルプロセスは、新しいプロセスの変数について何も知りません。理由を説明してください。
値が更新されていないか、まったく存在しません。
両方のプロセスはさまざまな方法で通信できますが、チャットで選択したプロセスは一時ファイルを使用しています。コマンドプロンプトまたは他のスクリプトでは、OPはcat myfile
変数の最新の値のみを表示できます。
この方法はこの状況に適しています。
- OPの現在の専門知識レベルと一致しています。
- 低データボリューム
- パフォーマンスの期待は低いです。
ファイルシステムは並行性問題を処理しており、OPはこの場合、競合状態や他の並行性問題に興味がないことを確認しました。
一度に1つのスクリプトコピーしか実行できない場合、ファイル名は定数になることがあります。それ以外の場合は、一時ファイルを割り当てる必要があります。ほとんどのシェルには一時ファイルを割り当てる方法があります。これが本番シナリオに近い場合、スクリプトは古いファイルを整理するのに少し努力する必要があります。