使用set -x
和tee
,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
答案 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
的调用的日志记录以使用此副本而不是默认标准。