我的 shebang 看起来像这样:
#!/usr/bin/expect -d
当我从命令行运行脚本时,它会提供我想要的内容。
但是,我通过 crontab 运行这个脚本。是否可以将调试开关保持打开状态,让它继续写入某种调试日志?
最佳答案
你必须使用 exp_internal
标志为 -f
和日志必须发生的文件名。
输出文件名必须跟在 0
或 1
之后。 0 或 1 像以前一样禁用或启用诊断的生成。
exp_internal -f file 0
的形式特别有用,因为 Expect 看起来就像没有生成诊断一样,即使它实际上是将通常的输出和诊断写入文件同时。您可以将此特定命令放在生产脚本中,用户不会受到该命令的影响。如果用户随后报告错误,您可以检查该文件并准确了解问题出在哪里。
示例:
#!/usr/bin/expect
exp_internal -f debug_info.log 0; # This is where the magic is happening ;)
expect {
quit { exit }
-re "(.+)\n" { puts "you typed $expect_out(1,string)";exp_continue}
timeout { puts "I am waiting for you";exp_continue }
}
如果您运行这个程序,我们可以在名为debug_info.log
的文件中获取调试信息,该文件将存储在当前目录中。 (即它是相对路径。您也可以提供绝对路径,例如/home/JLLouthan/somelogdir/mylog.log )
您也可以将此文件名设为动态。例如,您也可以将其作为命令行参数提供。
if {$argc!=1} {
puts "Usage : $argv0 <debug-file>"
exit
}
lassign $argv input_file
exp_internal -f $input_file 0
注意: exp_internal
命令可以放置在代码段周围以限制它们产生的诊断数量。每个 exp_internal
命令都会关闭以前由 exp_internal
命令命名的任何文件。
因此您可以将脚本的不同部分记录到不同的文件中。当脚本结束时,所有打开的 exp_internal
文件都会关闭。
关于expect - 如何将调试信息重定向到 expect 脚本中的文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27569885/