【问题标题】:bash storing the output of set -x to log filebash 将 set -x 的输出存储到日志文件
【发布时间】:2014-12-24 00:10:04
【问题描述】:

我有一个简单的下载脚本,我使用set -x,效果很好; 我可以看到它执行的每个步骤,并且可以识别脚本中的错误 或在下载中:

#!/bin/bash
set -x
#short_date=$(/bin/date +%m%d%y)
short_date=$(/bin/date -d "8 day ago" +%m%d%y)
#long_date=$(/bin/date +%Y%m%d)
long_date=$(/bin/date -d "8 day ago" +%Y%m%d)
scp -v -P 1332 -i /home/casper/.ssh/id_rsa_BANK friendly@192.168.1.10:/home/friendly/transfer/out/EXCHANGE_$short_date.csv /local/casper3/dailymetrics/BANK_$long_date.csv

我想自动化这项工作。有没有办法可以将set -x 输出保存到日志文件中?可能是一个日志文件 - 或每天不同的日志文件。我不知道什么最有效。

以下是上述脚本的示例set -x 输出。

++ /bin/date +%m%d%y
+ short_date=102814
++ /bin/date +%Y%m%d
+ long_date=20141028
+ scp -v -P 1332 -i /home/casper/.ssh/id_rsa_BANK friendly@192.168.1.10:/home/friendly/transfer/out/EXCHANGE_102814.csv /local/casper3/dailymetrics/BANK_20141028.csv
Executing: program /usr/bin/ssh host 192.168.1.10, user friendly, command scp -v -f /home/friendly/transfer/out/EXCHANGE_102814.csv
OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010
debug1: Reading configuration data /home/casper/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to 192.168.1.10 [192.168.1.10] port 7777.
debug1: Connection established.

【问题讨论】:

  • 哪个版本?使用 bash 4,您可以在不重定向所有 stderr 的情况下执行此操作;对于旧版本,它们都是相同的流。
  • 顺便说一句,您可能会考虑使用PS4=':$BASH_SOURCE:$LINENO+' 之类的方法来记录每个命令的文件和行。

标签: bash debugging output non-interactive


【解决方案1】:

假设 bash 4,BASH_XTRACEFD 可以设置为覆盖写入set -x 输出的文件描述符(默认为 2,stderr):

short_date=$(/bin/date +%m%d%y)
exec {BASH_XTRACEFD}>>"$short_date".log
set -x

如果运行 bash 4.0 而不是 4.1 或更高版本,您有 BASH_XTRACEFD 但没有自动分配文件描述符,这意味着您需要自己分配一个;在下面的示例中,我选择文件描述符 100:

short_date=$(/bin/date +%m%d%y)
exec 100>>"$short_date".log
BASH_XTRACEFD=100
set -x

对于旧版本,您唯一的选择是重定向所有 stderr,而不仅仅是 xtrace 流:

short_date=$(/bin/date +%m%d%y)
exec 2>>"$short_date.log"
set -x

【讨论】:

  • 应该是${BASH_XTRACEFD} 还是我需要阅读的特殊功能?
  • @Alfe,是的,这里有一个功能——前面提到的自动文件描述符分配。引用 bash 手册的重定向部分:“每个可能以文件描述符编号开头的重定向都可能以 {varname} 形式的单词开头。在这种情况下,对于每个重定向运算符,除了 >&- 和 &- 或
  • 也可以使用teeSTDERR 上保留一份副本,就像stackoverflow.com/questions/3173131/… 一样。
  • @AdamSpiers,如果您将跟踪的输出记录到不同的接收器,即使稍后将其重新加入到 stderr,您也会失去通过 tee 的副本和直接写入的内容之间的同步;因此,我不建议使用exec {BASH_XTRACEFD}> >(tee xtrace.log >&2) 或任何等效项。 (如果您打算将 all stderr 输出(来自 xtrace 和其他方式)记录到文件和控制台,则没有这个问题)。无论如何,这里的 OP 询问是否只记录 xtrace,这就是我回答这个问题的原因。
  • @AdamSpiers, ...POSIX 保证只有在写入相同 FD 的副本时才会在写入之间进行排序;一旦你重定向一个而不是另一个,事情就会变得一团糟。如果您尝试将 stdout 和 stderr 记录到两个不同的文件,则会遇到同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 2013-03-12
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多