SAC debug¶
不管是在 SAC 中执行稍复杂的命令,还是写 SAC 宏文件,又或者是在脚本中调用 SAC,都会遇到各种各样奇怪的错误,明明仔细检查了很多遍,执行起来还是有问题。这个时候先不要怀疑 SAC 有 bug,而是要先把自己写的东西好好 debug 一下。
SAC 其实自带了一个 debug 工具,即命令 echo。该命令用于控制是否显示 SAC 的输出(即警告信息、错误信息和正常的输出信息)以及输入(包括传递给 SAC 的命令、宏以及对命令的处理)。
以在 Perl 中调用 SAC 为例:
#!/usr/bin/env perl
use strict;
use warnings;
my $var0 = 3.0;
my $var1 = 5.0;
open(SAC, "|sac");
print SAC "r STA.BHN STA.BHE STA.BHZ \n";
print SAC "ch t0 $var0+$var1\n";
print SAC "w over";
print SAC "q\n";
close(SAC);
这个脚本是有问题的,但是对于刚刚写脚本的人来说,可能看不出问题。直接执行会出现如下错误:
ERROR 1312: Bad number of files in write file list: 1 3
SAC Error: EOF/Quit
SAC executed from a script: quit command missing
Please add a quit to the script to avoid this message
If you think you got this message in error,
please report it to: sac-help@iris.washington.edu
从这些输出信息里其实看不出来太多有用的信息。
如果加上“echo on
”,脚本如下:
#!/usr/bin/env perl
use strict;
use warnings;
my $var0 = 3.0;
my $var1 = 5.0;
open(SAC, "|sac");
print SAC "echo on\n"; # 加了这一行
print SAC "r STA.BHN STA.BHE STA.BHZ \n";
print SAC "ch t0 $var0+$var1\n";
print SAC "w over";
print SAC "q\n";
close(SAC);
运行结果如下:
r STA.BHN STA.BHE STA.BHZ
ch t0 3+5
w overq
ERROR 1312: Bad number of files in write file list: 1 3
SAC Error: EOF/Quit
SAC executed from a script: quit command missing
Please add a quit to the script to avoid this message
If you think you got this message in error,
please report it to: sac-help@iris.washington.edu
quit
此时会显示所有脚本传递给 SAC 来执行的命令,从中,可以很明显地看到两个错误。
一个是“print SAC "ch $var0+$var1\n"
”,由于使用的是 print
语句,perl 会直接做变量替换然后把结果传递给 SAC,因而真正传递给 SAC 的是
ch t0 3+5
,而不是想象中的 ch t0 8
,这个错误可以通过使用
printf
语句来解决。
另一个是,由于 print SAC "w over"
语句中忘了加换行符,导致实际传递给 SAC 的不是 w over
,而是 w overq
,即内存中有三个波形文件,而 write
命令中却只给了一个文件名,因而出现了错误1312。
由此可见,echo 命令可以帮助用户清楚地知道真正传递给 SAC 的是什么,因而是一个很好的 SAC 调试工具。