tcl spawn sftp无法正常工作

时间:2012-11-26 10:31:15

标签: tcl expect

我正在尝试运行一个非常简单的tcl脚本

package require Expect
spawn sftp user@host

我得到的错误是

  

系统找不到指定的文件。       执行时   “spawn sftp user @ host”

我认为应该以某种方式指定sftp路径的唯一原因。我从批处理脚本调用它,我也尝试在调用脚本之前将目录更改为sftp位置,但错误仍然相同。

1 个答案:

答案 0 :(得分:2)

到目前为止,问题的最可能原因是sftp程序不在PATH上的目录中。这个概念在各个平台上几乎相同,但有一些小问题。

使用Unix PATH

通过输入以下内容,检查sftp已知目录中是否有PATH可用:

which sftp

在shell提示符下。它应该响应sftp程序的位置,但是如果找不到,那么你根本就得不到任何响应。如果找不到,则需要自己查找并将其位置(严格地说,包含该程序的目录)添加到PATH。找到类似的程序:

locate sftp

或(非常慢!):

find / -name sftp -print

要将目录附加到PATH,请在shell中执行此操作:

PATH=$PATH:/the/dir/to/append

您也可以在Expect脚本中添加目录(当然,只要它在spawn之前!):

append env(PATH) : /the/dir/to/append

使用Windows PATH

在Windows上,使用Windows搜索( Windows + F IIRC)并查找名为sftp.exe的文件(还有一个命令行搜索工具,但是我忘记了如何使用它。)

使用Windows PATH, little 需要更多关注:

append env(PATH) ";" {C:\the\dir\to\append}

# Or this...
append env(PATH) ";" [file nativename C:/the/dir/to/append]

也就是说,Windows PATH使用不同的分隔符(因为:用于将驱动器名称与目录部分分开)并且必须使用目录的本机名称,而不是更为方便的正斜杠变化(反斜杠与Tcl的语法相互作用,因此{括号})。如果你在追加之前使用file nativename进行转换,可以使用正斜杠,就像我的第二个版本一样。

一些可以提供帮助的Tcl技术

您可以使用Tcl命令auto_execok查看某个程序是否在PATH上。例如:

puts [auto_execok sftp]

但是,对于某些命令(尤其是Windows上的start),您会得到更复杂的响应;该命令确实作为支持交互式Tcl使用的代码的一部分存在,描述了如何运行某些外部程序,这些程序有时可能比初看起来要复杂得多。尽管如此,它仍然接近于本答案开头列出的which的跨平台版本......

Tcl 8.6提供$tcl_platform(pathSeparator)变量作为获取PATH元素分隔符(:;,取决于平台)的方法。可能没有帮助你,因为8.6尚未像以前的版本那样广泛分发。