Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 脚本日志记录,每个脚本的文件_Bash_Shell_Ksh - Fatal编程技术网

Bash 脚本日志记录,每个脚本的文件

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

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 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