expect - 如何将调试信息重定向到 expect 脚本中的文本文件?

标签 expect

我的 shebang 看起来像这样:

#!/usr/bin/expect -d

当我从命令行运行脚本时,它会提供我想要的内容。

但是,我通过 crontab 运行这个脚本。是否可以将调试开关保持打开状态,让它继续写入某种调试日志?

最佳答案

你必须使用 exp_internal 标志为 -f 和日志必须发生的文件名。

输出文件名必须跟在 01 之后。 0 或 1 像以前一样禁用或启用诊断的生成。

enter image description here

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 文件都会关闭。

引用:Exploring Expect

关于expect - 如何将调试信息重定向到 expect 脚本中的文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27569885/

相关文章:

linux - 期望:检索命令的返回码

linux - 当我通过 expect 使用 scp 命令时,星号无法识别

Linux - Bash 和 Expect

linux - 将 'sed' 到 'spawn' 执行到预期脚本中

linux - 如何 ssh+expect 登录并 su 到远程机器上的另一个用户?

bash - 使用 expect 确认密码

linux - 当使用expect脚本中的交互处理ssh时,如何隐藏或编辑关闭ssh时的消息

tcl - 如何从 Expect 中的变量生成

bash - 使用 expect(1) 登录 SSH。如何退出 expect 并留在 SSH 中?

bash - 从执行 bash 脚本中清除历史记录中的最后一个 bash 命令