Bash 脚本日志记录,每个脚本的文件
Shell脚本日志记录使用Bash 脚本日志记录,每个脚本的文件,bash,shell,ksh,Bash,Shell,Ksh,Shell脚本日志记录使用set-x和tee相当容易,但我希望脚本1调用脚本2,并在各自的日志文件中执行这两个日志。现在,脚本1包含脚本2生成的日志,但我只希望脚本1日志中包含脚本1的命令,脚本2日志中包含脚本2的命令 以下是我尝试过的: script1.sh script2.sh 这将生成两个日志文件,但script1.log.date包含两个脚本的所有输出,而script2.log.date仅包含script2输出 使用上面的代码script1.log.data包含: + ls script
set-x
和tee
相当容易,但我希望脚本1调用脚本2,并在各自的日志文件中执行这两个日志。现在,脚本1包含脚本2生成的日志,但我只希望脚本1日志中包含脚本1的命令,脚本2日志中包含脚本2的命令
以下是我尝试过的:
script1.sh
script2.sh
这将生成两个日志文件,但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
在script2中,您使用的是
tee-a
,它复制输出,一次复制到文件,一次复制到标准输出
在script1中,捕获所有输出(包括来自script2的重复输出),并将其记录到文件和stdout中
如果终端输出不重要,只需跳过script2中的tee
如果希望拆分script1中的日志记录,以便不捕获script2的输出,而捕获所有其他命令的输出。然后必须打开并重定向到其他输出通道。倾向于麻烦。在script2中,您使用的是
tee-a
,它复制输出,一次复制到文件,一次复制到标准输出
在script1中,捕获所有输出(包括来自script2的重复输出),并将其记录到文件和stdout中
如果终端输出不重要,只需跳过script2中的tee
如果希望拆分script1中的日志记录,以便不捕获script2的输出,而捕获所有其他命令的输出。然后必须打开并重定向到其他输出通道。倾向于麻烦。当您在
script2
中使用tee
时,执行脚本时,输出既会发送到日志文件,也会发送到脚本的标准输出。由于脚本的标准输出正在登录到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
时的日志记录,以使用此副本而不是默认的标准输出。在script2
中使用tee
时,当脚本被执行时,输出将同时发送到日志文件和脚本的标准输出。由于脚本的标准输出正在登录到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时的日志记录,以使用此副本而不是默认的标准输出。不幸的是,这不起作用。script1.log。仍然包含script2.log.date中的所有内容。`$cat SCRIPT 1.log.20170418113405+ls-al SCRIPT 1.sh-rwxr-xr-x 1 slanglois eng 164 2017年4月18日SCRIPT 1.sh+。/SCRIPT 2.sh+日期+%Y%m%d%H%m%S+log=SCRIPT 2.log.20170418113405+tee-a SCRIPT 2.log.20170418113405+1日期Tue 2017年美国东部夏令时11:34:05+ls-al SCRIPT 2.sh-rwxr-xr-xr-x 1 slanglois eng 87 2017年4月17日14:59我在哪里在script1.log.date文件中不执行script2.log。很抱歉格式化了。背部蜱虫不起作用。不幸的是,这不起作用。script1.log。仍然包含script2.log.date中的所有内容。`$cat SCRIPT 1.log.20170418113405+ls-al SCRIPT 1.sh-rwxr-xr-x 1 slanglois eng 164 2017年4月18日SCRIPT 1.sh+。/SCRIPT 2.sh+日期+%Y%m%d%H%m%S+log=SCRIPT 2.log.20170418113405+tee-a SCRIPT 2.log.20170418113405+1日期Tue 2017年美国东部夏令时11:34:05+ls-al SCRIPT 2.sh-rwxr-xr-xr-x 1 slanglois eng 87 2017年4月17日14:59我在哪里在script1.log.date文件中不执行script2.log。很抱歉格式化了。背虱不起作用。
#!/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