次のようにコマンドの出力(ターミナルに表示)をログファイルに印刷する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行目は、ロジックを表示するためにハッシュされていないままにすることができます。