我正在Linux RedHat 中编写SH Shell 脚本。我可以使用“set -x | tee > output.file”吗?

问题描述 投票:0回答:2

在我的脚本的开头有“set -x”行。当然,这会将所有输出发送到屏幕。这正是我喜欢的,这样我就可以看到脚本正在做什么并解决问题。一旦脚本正常工作,我就会注释掉“set -x”行。

我想输出 set -x 的输出,以便我有一个文件可以查看,而不是仅使用显示。有办法做到这一点吗?

我尝试过“set -x | tee ScriptNameHere.DEBUG”,它给了我一个名为 ScriptNameHere.DEBUG 的文件,其中包含零字节......一个空文件。

设置-x | tee 脚本名.debug 设置-x | tee -a 脚本名.debug

全部给我一个名为 scriptname.debug 的零字节文件。

bash shell set tee
2个回答
1
投票

您无法使用 sh 执行此操作,但可以使用 bash 执行此操作(只要您不是使用 Apple 提供的史前版本)。

#!/usr/bin/env bash
case $BASH_VERSION in
  ''|[1-3].*|4.[012].*) echo "ERROR: bash 4.3 or newer required" >&2; exit 1;;
esac

exec {BASH_XTRACEFD}> >(tee -a ScriptNameHere.DEBUG >&2)
set -x
# ... other content of your script below

解释上述内容:

  • exec
    仅传递重定向而不是命令时,它会在当前 shell 中执行这些重定向。
  • 在 bash 4.x 及更高版本中,
    BASH_XTRACEFD
    给出 xtrace (
    set -x
    ) 将写入日志的文件描述符的编号。
  • 从 4.x 系列稍后的某个地方开始(4.1?4.3?),
    {varname}>file
    的重定向会动态地将文件描述符编号分配给写入文件
    "$varname"
    的句柄的变量
    file

0
投票

set -x | whatever
>wherever
仅发送
set -x
本身的输出 - 不输出任何内容!它打开跟踪输出,该输出来自 shell,而不是 shell 运行的任何命令。

不过,你可以捕捉它;只需重定向 stderr,例如与

exec 2>>trace.out
set -x

或者,让它同时进入屏幕和文件

exec 2> >(tee -a trace.out)
set -x
© www.soinside.com 2019 - 2024. All rights reserved.