bash将set -x的输出存储到日志文件中

cap*_*ser 5 debugging bash non-interactive output

我有一个简单的下载脚本,我用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
Run Code Online (Sandbox Code Playgroud)

我想自动完成这项工作.有没有办法将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.
Run Code Online (Sandbox Code Playgroud)

Cha*_*ffy 11

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

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

如果运行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
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Alfe,是的,这里有一个功能-前面提到的自动文件描述符分配。从bash手册的重定向部分引用:“可能在文件描述符编号之后的每个重定向都可以以{varname}形式的单词开头。在这种情况下,对于每个重定向运算符,除了>&-和< &-,Shell将分配一个大于10的文件描述符,并将其分配给{varname}。如果>&-或<&-后面带有{varname},则varname的值定义要关闭的文件描述符。” (2认同)