lang/expect:如果先前的二进制文件不存在,则执行不同的二进制文件

lang/expect: execute a different binary if the prior one doesn't exist

我正在使用 lang/expect,对于 spawn 命令,我想有条件地执行两个不同的二进制文件之一,例如,取决于 qemu-system-x86_64存在,我想执行 spawn qemu-system-x86_64 …,或者,如果它不存在,则只需调用 spawn kvm …。 (kvmqemu-… 命令的参数相同,只是可执行文件本身的名称不同。)

我如何在 Expect 语言中做到这一点?

根据 documentation of how the spawn directive within expect works (it internally does a fork),一种 "recommended" 方法是通过查看生成的进程打印到其终端的内容来查看执行是否失败;但是,这不是最佳选择,因为我只是想测试给定的可执行文件是否存在(在 $PATH 中)。

您可以使用 Tcl 命令 auto_execok cmd,其中 returns cmd 的完整路径(相对于 PATH 环境变量),或空字符串如果找不到 cmd。 有关详细信息,请参阅 https://www.tcl.tk/man/tcl8.6/TclCmd/library.htm#M6

if {[auto_execok qemu-system-x86_64] != {}} {
    # qemu-system-x86_64 is found in the path. spawn it...
    spawn qemu-system-x86_64 
} else {
    # fall back to kvm
    spawn kvm
}