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