我用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
附近加上引号并不能解决问题。
答案 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] $