単語が見つかると端末にドットを印刷する[閉じる]

単語が見つかると端末にドットを印刷する[閉じる]

次のようにコマンドの出力(ターミナルに表示)をログファイルに印刷するbashがあるとします。

#!/bin/bash
exec 3>&1 
exec 1> logfile.log # logfile.log contains all what will be printed in terminal and it will keep updating its content till the script finish it is job
command#1
command#2
command#3
.
.
.
.
.
echo -n "Process is DONE ..."
exec 1>&3
exec 3>&- 

このスクリプトの完了に数分かかる場合は、スクリプトに含まれているコマンドを1つずつ実行して完了できます。

このスクリプトは、 ""logfile.log"ファイルでプロセスが完了しました"という文が見つかるまで、どのように毎秒ポイントを印刷しますか?または、プロセスがまだ実行中であることを示すために、画面にタスク(プログレスバーやスクリーンショットなど)を作成しますか?

答え1

私が見るには、あなたが使っているデザインがとても狡猾だと思います。次のデザインを検討できます。

#!/bin/bash

LOG=logfile.log

#echo $i #what's this for?
exec 3>&1 
exec 1> "$LOG" # logfile.log contains all what will be printed in terminal and it will keep updating its content till the script finish it is job
#command1 &
sleep 5 &
sleep 10 &
sleep 15 &
for i in {1..7}; do
    echo x
    sleep 1
done &
#command2 &
#command3 &
#and so on...

exec 1>&3
exec 3>&- 
echo Progress:
while [ $(jobs -pr | wc -l) -gt 0 ] ; do 
    #jobs
    echo -n "."
    sleep 1
done

echo -e "\nProcess is DONE ..." | tee -a "$LOG"

いくつかの説明行を追加しました。

  • 9-15行はサンプルコマンドです。
  • 24行目は、ロジックを表示するためにハッシュされていないままにすることができます。

答え2

特定の文字列を見つける必要がありますか、それともプロセスが終了したら視聴を中断するのに十分ですか?簡単なアプローチは、出力を次のように渡すことですpvマニュアルページ)進行状況バーをインポートすると、tail最後に出力ファイルを確認して、最後に何が起こったかを確認できます。

構成例:

./process.sh  | pv > output.file ; tail -1 output.file 
  34 B 0:00:02 [16.8 B/s] [   <=>                                ]
Process done.

関連情報