0

这是我使用的脚本的简化版本:在其简化版本中,tt 应该input逐行读取文件,然后将其打印到标准输出并写入文件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

这时候我需要按回车来终止脚本。请注意,在执行过程中出现了命令提示符-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

to的-a参数tee将附加到日志中。

于 2013-08-01T16:55:17.117 回答
1

正在发生的事情是tee "$logfile"异步运行。当您使用这样的进程替换时,主脚本不会等待进程退出。

所以until循环运行,主脚本退出,shell 打印提示,然后tee打印它的输出。

您可以通过以下方式更轻松地看到这一点:

echo Something > >(sleep 5; cat)

你会得到一个命令提示符,然后 5 秒后Something会出现。

几年前在 comp.unix.shell 中有一个关于这种行为的线程。看这里

于 2013-08-01T16:55:48.523 回答