0

これは私が使用するスクリプトの簡略化されたバージョンです。簡略化されたバージョンでは、tt はファイルを 1input行ずつ読み取り、標準出力に出力し、ファイルにも書き込みますlog

inputファイル:

asas
haha
asha
hxa

スクリプト (という名前simple):

#!/bin/bash

FILE=input
logfile="log"

exec > >(tee "$logfile")   # redirect the output to a file but keep it on stdout
exec 2>&1

DONE=false
until $DONE; do
read || DONE=true
  [[ ! $REPLY ]] && continue                      #checks if a line is empty

  echo "----------------------"

  echo $REPLY

done < "$FILE"
echo "----------------------"
echo ">>> Finished"

出力 (コンソール上):

-bash-3.2$ ./simple
-bash-3.2$ ----------------------
asas
----------------------
haha
----------------------
asha
----------------------
hxa
----------------------
>>> Finished

この時点で、Enter キーを押してスクリプトを終了する必要があります。実行中にコマンド プロンプト-bash-3.2$が表示されたことに注意してください。

これらの行が原因であることを確認しました:

exec > >(tee "$logfile")   # redirect the output to a file but keep it on stdout
exec 2>&1

それらがなければ、出力は期待どおりです。

-bash-3.2$ ./simple
----------------------
asas
----------------------
haha
----------------------
asha
----------------------
hxa
----------------------
>>> Finished
-bash-3.2$

さらに、スクリプトを終了するために Enter キーを押す必要はありません。残念ながら、出力をコンソール (stdout) とログ ファイルの両方に保存する必要があります。

これはどのように修正できますか?

4

3 に答える 3

1

一時停止してユーザー入力を待つだけの場合は、pause コマンドを使用します。

 pause
于 2013-08-01T16:51:31.593 に答える
1

teeエコーラインで直接使用できます。

例えば:

[ben@lappy ~]$ echo "echo and save to log" | tee -a example.log
echo and save to log
[ben@lappy ~]$ cat example.log 
echo and save to log

への-a引数teeは、ログに追加されます。

于 2013-08-01T16:55:17.117 に答える
1

何が起こっているかというtee "$logfile"と、非同期で実行されています。そのようなプロセス置換を使用すると、メイン スクリプトはプロセスが終了するのを待ちません。

したがって、untilループが実行され、メイン スクリプトが終了し、シェルがプロンプトを出力してからtee、その出力を出力します。

これは、次の方法でより簡単に確認できます。

echo Something > >(sleep 5; cat)

コマンド プロンプトが表示され、5 秒後Somethingに表示されます。

数年前に comp.unix.shell にこの動作に関するスレッドがありました。ここで見る

于 2013-08-01T16:55:48.523 に答える