脚本记录,每个脚本的文件

时间:2017-04-17 17:34:23

标签: bash shell ksh

使用set -xtee,shell脚本日志记录相当简单,但我希望脚本1调用脚本2,并在自己的日志文件中同时执行日志。现在,脚本1包含脚本2生成的日志,但我真的只想要脚本1日志中脚本1的命令和脚本2日志中脚本2的命令。

以下是我的尝试:

script1.sh

#!/bin/ksh
set -x

LOG=script1.log.$(date +%Y%m%d%H%M%S)
{
  ls script1.sh
  set +x
  ./script2.sh
  set -x
  ls script2.sh
} 2>&1 | tee -a $LOG

script2.sh

#!/bin/ksh
set -x

LOG=script2.log.$(date +%Y%m%d%H%M%S)
{
  date
} 2>&1 | tee -a $LOG

这会产生两个日志文件,但script1.log.date包含两个脚本的所有输出,script2.log.date仅包含script2输出。

使用上面的代码script1.log.data包含:

+ ls script1.sh
script1.sh
+ ./script2.sh
+ date +%Y%m%d%H%M%S
+ LOG=script2.log.20170418151625
+ + tee -a script2.log.20170418151625
2>& 1
+ date
Tue Apr 18 15:16:25 EDT 2017
+ ls script2.sh
script2.sh

但是,我想要包含:

+ ls script1.sh
script1.sh
+ ./script2.sh
+ ls script2.sh
script2.sh

2 个答案:

答案 0 :(得分:0)

在script2中,您正在使用tee -a复制输出,一次归档到一次到stdout。

在script1中,您捕获所有输出(包括来自script2的重复输出)并将其记录到文件和stdout。

如果终端输出不重要,只需跳过脚本2中的tee

如果要在script1中拆分日志记录,那么不会捕获script2的输出,而是从所有其他命令输出。然后你必须打开并重定向到其他输出通道。想要麻烦。

答案 1 :(得分:0)

tee中使用script2时,输出会在执行时输出到日志文件和脚本的标准输出。由于脚本的标准输出已记录在script1中,script1也会看到输出。

我假设您还希望在运行script1时,两个脚本的输出都显示在控制台上?如果没有,那么我认为根本没有理由使用tee。如果是,那么您需要在script1中保存原始标准输出描述符,以便您可以重定向script2以使用它而不是日志描述符。

我还没有测试过下面的代码,所以请耐心等待,但类似的东西应该有效:

#!/bin/ksh
set -x

{
  LOG=script1.log.$(date +%Y%m%d%H%M%S)
  {
    ls -al
    set +x
    ./script2.sh 1>&3
    set -x
    ls -al
  } 2>&1 | tee -a $LOG
} 3>&1

我打算在上面做的是将文件描述符1的副本(原始标准输出,如控制台)保存为文件描述符3,然后覆盖对script2.sh的调用的日志记录以使用此副本而不是默认标准。