捕获输出/错误到日志时无需回车

捕获输出/错误到日志时无需回车

我有以下代码。我试图将输出和错误捕获到日志文件和控制台。运行代码时,它会显示用法,但随后会暂停以进行回车。没什么大不了的,只是想知道如何消除这种回车的需要?我已将其范围缩小到执行行,如下所示。如何在不需要回车的情况下实现这一点?谢谢你!

#!/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

脚本中的任何命令不会导致暂停。该脚本成功运行直至完成。之所以会出现明显的暂停,是因为 shell 提示符与脚本输出混合在一起,并且正常的提示符等待点位于 . 发出的最后一个记录行之后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,系统正在等待下一个命令。您可以通过键入pwd并按 ENTER 来确认这一点,shell 将显示当前目录。相反,如果您只按 ENTER 键,则会按预期再次显示 shell 提示符。

sleep 1回答这个问题时,您可以通过在每个命令之前包含一个命令来显示提示exit,以便系统有一些时间来刷新输出。

这是因为日志重定向是使用进程替换 [>()>>()] 配置的,并且该tee命令与脚本同时运行,因此当它结束时,tee仍然将文本发送到终端和日志文件。

相关内容