我正在尝试运行一个非常简单的tcl脚本
package require Expect
spawn sftp user@host
我得到的错误是
系统找不到指定的文件。 执行时 “spawn sftp user @ host”
我认为应该以某种方式指定sftp路径的唯一原因。我从批处理脚本调用它,我也尝试在调用脚本之前将目录更改为sftp位置,但错误仍然相同。
答案 0 :(得分:2)
到目前为止,问题的最可能原因是sftp
程序不在PATH
上的目录中。这个概念在各个平台上几乎相同,但有一些小问题。
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
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命令auto_execok
查看某个程序是否在PATH
上。例如:
puts [auto_execok sftp]
但是,对于某些命令(尤其是Windows上的start
),您会得到更复杂的响应;该命令确实作为支持交互式Tcl使用的代码的一部分存在,描述了如何运行某些外部程序,这些程序有时可能比初看起来要复杂得多。尽管如此,它仍然接近于本答案开头列出的which
的跨平台版本......
Tcl 8.6提供$tcl_platform(pathSeparator)
变量作为获取PATH
元素分隔符(:
或;
,取决于平台)的方法。可能没有帮助你,因为8.6尚未像以前的版本那样广泛分发。