キャリッジリターンなしでログに記録される出力/エラーキャプチャ

キャリッジリターンなしでログに記録される出力/エラーキャプチャ

次のコードがあります。出力とエラーをログファイルとコンソールにキャプチャしようとしています。コードを実行すると使用法が表示されますが、キャリッジリターンのために一時停止されます。大きな問題ではありません。このキャリッジリターンの必要性を取り除く方法が気になりますか?以下のように実行ラインで範囲を絞りました。キャリッジリターンを要求せずにこれを達成できますか?ありがとうございます!

#!/bin/bash

log_file=$0.log

# The following line causes need for carriage return
exec > >(tee -a ${log_file} )
exec 2> >(tee -a ${log_file} >&2)

usage()
{
  echo
  echo "usage: $0 --option1 --option2 --option3 --option4 | [-h]"
  echo
}

while [ "$1" != "" ]; do
  case $1 in
    --option1 )            shift
                           OPTION1=$1
                           ;;
    --option2 )            shift
                           OPTION2=$1
                           ;;
    --option3 )            shift
                           OPTION3=$1
                           ;;
    --option4 )            shift
                           OPTION4=$1
                           ;;
    -h | --help )          usage
                           exit
                           ;;
    * )                    usage
                           exit 1
esac
shift
done

usage
exit

答え1

スクリプトのどのコマンドも一時停止を引き起こしません。スクリプトが完了するまで正常に実行されます。明らかな一時停止は、シェルプロンプトがスクリプト出力と混在して発生し、通常のプロンプト待機ポイントは、エクスポートされた最後に記録された行以降に発生しますtee。次のコマンドを使用してスクリプトを実行する方がはっきりしますbash -x(時間/日付/ディレクトリデータが表示されるようにプロンプ​​トを設定したために表示されます)。

15:28:38 - mié mar 02 - Dir: ~
user@host$ bash -x testexec.sh
+ log_file=testexec.sh.log
+ exec
+ exec
++ tee -a testexec.sh.log
++ tee -a testexec.sh.log
15:28:38 - mié mar 02 - Dir: ~
user@host$
usage: /home/manto/testexec.sh --option1 --option2 --option3 --option4 | [-h]

+ '[' '' '!=' '' ']'
+ usage
+ echo
+ echo 'usage: /home/manto/testexec.sh --option1 --option2 --option3 --option4 | [-h]'
+ echo
+ exit

スクリプトが正常に終了し、カーソルが最後のスクリプトの下に表示され、+exitシステムは次のコマンドを待っています。 ENTERと入力して押すとこれを確認でき、pwdシェルは現在のディレクトリを表示します。逆に、Enterキーを押すだけで、シェルプロンプトが期待どおりに再表示されます。

sleep 1exitこの質問に答えると、システムが出力を更新する時間を持つように、各コマンドの前にコマンドを含めてプロンプトを表示できます。

>()これは、プロセス置換[および]を使用してログリダイレクトを設定し、コマンドがスクリプト>>()tee同時に実行されるため、終了後もテキストが端末ファイルteeとログファイルに送信されるためです。

関連情報