“期待tcl”;“文件存在”;功能失败,即使;ls";显示文件

“期待tcl”;“文件存在”;功能失败,即使;ls";显示文件,tcl,expect,Tcl,Expect,我使用spawn sh生成一个shell实例,并运行一些命令来生成文件。然后,我使用下面的验证文件是否存在来检查它们是否已创建。使用文件存在总是失败!为了进一步说明我的问题,我编辑了下面的过程。我显式地创建了hello.txt,并检查它是否存在,但总是失败 proc verify_file_exists {filename} { send "touch hello.txt\r" if {[file exists hello.txt]} { puts "hello.

我使用
spawn sh
生成一个shell实例,并运行一些命令来生成文件。然后,我使用下面的
验证文件是否存在
来检查它们是否已创建。使用
文件存在
总是失败!为了进一步说明我的问题,我编辑了下面的过程。我显式地创建了
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
    }
}
我还尝试了其他方法:在调用
验证文件\u是否存在
之前,我放置了一个
interactive++return
语句,这将我置于
sh
实例中。然后运行
touch hi.txt
,然后运行
expect
并输入一个
expect
实例。然后,如果我运行
文件exists hi.txt
,我确实会得到
1
的肯定响应!所以这不可能是权限问题,对吧

如果我执行与上面相同的操作,但手动触摸hello.txt,则该过程仍会在
文件存在
行失败

为什么
文件存在
不能作为
expect
ed工作


注意:在
hello.txt
周围加引号并不能解决问题。

send
之后,您需要等待下一个shell提示出现,这意味着最后一个命令已经完成。这就是为什么
send
后面通常跟着
expect
。对于快速测试,您还可以在
发送后添加
睡眠1

另一种可能性是,Expect进程“current dir”与派生的shell进程“current dir”不同

这两方面都有一个简单的例子:

[步骤101]$cat example.exp
proc expect_prompt{}{
expect-re{bash-[.0-9]+[#$]$}
}
生成bash--norc
期待你的提示
发送“rm-f foo bar&&touch foo\r”
期待你的提示
如果{[file exists foo]}{
发送“#找到foo!\r”
期待你的提示
}
发送“mkdir-p tmp和&cd tmp和&rm-f栏和触摸栏\r”
期待你的提示
如果{![file exists bar]}{
发送“#酒吧在哪里?\r”
期待你的提示
}
发送“退出\r\n”
预期eof
[步骤102]$expect example.exp
生成bash--norc
bash-4.4$rm-f foo和touch foo
bash-4.4$#找到了foo!
bash-4.4$mkdir-p tmp和&cd tmp和&rm-f栏和触摸栏
bash-4.4$#酒吧在哪里?
bash-4.4$exit
出口
[步骤103]$

如果提供带有绝对路径的文件名,会发生什么情况?@PeterLewerin我尝试使用绝对路径,但无效。我确实尝试了一个指向预先存在的文件的绝对路径,它确实起了作用。这让我觉得这确实与文件是在脚本过程中创建的这一事实有关。我假设
文件存在的查询可以在
触摸
完成之前进行处理。@PeterLewerin在我尝试输入
交互++返回
然后运行的
触摸
命令之后
ls
验证文件是否确实已创建。然后我键入++返回控件,但仍然看到相同的失败。是的,对不起,忘记了。我现在要停止制造噪音了:这里还有其他人,与我不同,他们知道如何处理expect。答案是expect的当前目录和生成的shell的当前目录确实不一样。我通过将
pwd
作为变量传递来解决这个问题。非常感谢。