次のコードがあります。出力とエラーをログファイルとコンソールにキャプチャしようとしています。コードを実行すると使用法が表示されますが、キャリッジリターンのために一時停止されます。大きな問題ではありません。このキャリッジリターンの必要性を取り除く方法が気になりますか?以下のように実行ラインで範囲を絞りました。キャリッジリターンを要求せずにこれを達成できますか?ありがとうございます!
#!/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 1
exit
この質問に答えると、システムが出力を更新する時間を持つように、各コマンドの前にコマンドを含めてプロンプトを表示できます。
>()
これは、プロセス置換[および]を使用してログリダイレクトを設定し、コマンドがスクリプト>>()
とtee
同時に実行されるため、終了後もテキストが端末ファイルtee
とログファイルに送信されるためです。