即使“ls”显示文件,预计tcl“文件存在”功能也会失败

时间:2018-03-16 17:45:17

标签: tcl expect

我用spawn sh生成一个shell实例,并运行一些命令来生成文件。然后我使用下面的verify_file_exists来检查它们是否已创建。使用file exists总是失败!我编辑了下面的程序,以进一步说明我的问题。我明确地创建hello.txt并检查它是否存在,但它总是失败。

proc verify_file_exists {filename} {
    send "touch hello.txt\r"
    if {[file exists hello.txt]} {
        puts "hello.txt found\r"
    } else {
        puts "Failed to find hello.txt\r" # Always fails
        exit 1
    }
}

我也尝试了其他的东西:我在致电interact ++ return之前发出了verify_file_exists声明,这使我进入sh实例。然后我运行touch hi.txt,然后运行expect并输入expect实例。然后,如果我运行file exists hi.txt得到1的肯定回复!所以这不是一个许可问题,对吗?

如果我执行上述操作但手动touch hello.txt,则该过程仍然会在file exists行失败。

为什么file exists无效expect编辑?

注意:在hello.txt附近加上引号并不能解决问题。

1 个答案:

答案 0 :(得分:1)

send之后,您需要等待下一个shell提示符显示,这意味着最后一个命令已完成。这就是send通常后跟expect的原因。要进行快速测试,您还可以在sleep 1之后添加send

另一种可能性是Expect进程'当前目录与 spawn ed shell进程'当前目录不同。

两者的简单示例:

[STEP 101] $ cat example.exp
proc expect_prompt {} {
    expect -re {bash-[.0-9]+[#$] $}
}

spawn bash --norc
expect_prompt

send "rm -f foo bar && touch foo\r"
expect_prompt
if { [file exists foo] } {
    send "# found foo!\r"
    expect_prompt
}

send "mkdir -p tmp && cd tmp && rm -f bar && touch bar\r"
expect_prompt
if { ! [file exists bar] } {
    send "# where's bar?\r"
    expect_prompt
}

send "exit\r"
expect eof
[STEP 102] $ expect example.exp
spawn bash --norc
bash-4.4$ rm -f foo && touch foo
bash-4.4$ # found foo!
bash-4.4$ mkdir -p tmp && cd tmp && rm -f bar && touch bar
bash-4.4$ # where's bar?
bash-4.4$ exit
exit
[STEP 103] $