watchコマンドから変数を再ロードできますか?

watchコマンドから変数を再ロードできますか?

私の仕事にはいくつかのデータ処理が含まれています。タスクの1つは、一連のディレクトリを「フラット化」することです。目次一時的に)DirFlatという名前の新しい場所にコピーします。

時間がかかることがあります(30分 - > 2〜3時間)!進捗状況を確認したいので、find Dir -type f|wc -lファイルの数を取得してから(これを呼び出す$Filenum)、私が書いた非常に短いコマンドを実行しました(私のラップトップで再入力しましたが、おそらくコピーエラーだったでしょう。要点):

echo $(echo "($ls DirFlat |wc -l)*100/$FileNum"|bc) "%" $(date)

ただし、実行すると、watch -n 100 "!!"エコーされた出力を取得し、その出力を印刷し続けます(日付は変わりません)。

これを使用してBASHで変数を更新したり、内部変数の割り当てを再実行したりできますか?これがいくつかのタスクを自動化するのに役立つことを願っています。

答え1

比較:

$ watch -n 1 "echo $(date)"
Every 1.0s: echo Sat Apr 27 03:10:50 CEST 2013

$ watch -n 1 'echo $(date)'
Every 1.0s: echo $(date)

あなたがすることはandを実行しecho "($ls DirFlat |wc -l)*100/$FileNum"|bcdate各コマンドの出力をシェルコマンドに置き換えてwatch -n 100 "echo $(…) % $(…)"から実行するだけです。コマンドが親シェルから拡張されるのを防ぎ、代わりに文字列として渡してwatch実行する必要があります。コマンドの周囲に二重引用符の代わりに一重引用符を使用します。

答え2

あるいは、それをシェルループにラップすることもできます。

while sleep 100; do
    (... your stuff ...)
    if [ (... process has finished ...) ]; then
        (... beep or get operator's attention otherwise ...)
        break
    fi
done

答え3

これをシェルスクリプトに入れ、そのスクリプトを呼び出すように監視する必要があります。

答え4

実行したいコマンドとsleepコマンドを使用するwhileループを使用すると、watchコマンドのようにLinuxコマンドを繰り返し実行することもできます。しかし、この特定のケースでは終了条件があるため、@peterphの答えが良いです。この短い応答は、同じプロセスを再実行するときに更新する方法に関する質問にのみ答えます。

while true; do echo $(date +"%T"); sleep 1; done

睡眠後の数字は秒単位です。

関連情報