在我的脚本的开头有“set -x”行。当然,这会将所有输出发送到屏幕。这正是我喜欢的,这样我就可以看到脚本正在做什么并解决问题。一旦脚本正常工作,我就会注释掉“set -x”行。
我想输出 set -x 的输出,以便我有一个文件可以查看,而不是仅使用显示。有办法做到这一点吗?
我尝试过“set -x | tee ScriptNameHere.DEBUG”,它给了我一个名为 ScriptNameHere.DEBUG 的文件,其中包含零字节......一个空文件。
设置-x | tee 脚本名.debug 设置-x | tee -a 脚本名.debug
全部给我一个名为 scriptname.debug 的零字节文件。
您无法使用 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_XTRACEFD
给出 xtrace (set -x
) 将写入日志的文件描述符的编号。{varname}>file
的重定向会动态地将文件描述符编号分配给写入文件 "$varname"
的句柄的变量 file
。set -x | whatever
或 >wherever
仅发送 set -x
本身的输出 - 不输出任何内容!它打开跟踪输出,该输出来自 shell,而不是 shell 运行的任何命令。
不过,你可以捕捉它;只需重定向 stderr,例如与
exec 2>>trace.out
set -x
或者,让它同时进入屏幕和文件
exec 2> >(tee -a trace.out)
set -x