3

非常に単純な tcl スクリプトを実行しようとしています。

package require Expect
spawn sftp user@host

私が得るエラーは

システムは、指定されたファイルを見つけることができません。「spawn sftp user@host」の実行中

私が見る唯一の理由は、sftpパスを何らかの形で指定する必要があるということです。これをバッチ スクリプトから呼び出し、スクリプトを呼び出す前にディレクトリを sftp の場所に変更しようとしましたが、エラーは同じです。

4

1 に答える 1

2

ここでの問題の原因として最も可能性が高いのは、sftpプログラムが .ini 上のディレクトリにないことですPATH。概念はプラットフォーム間でほぼ同じですが、いくつかの小さな問題があります。

Unix での作業PATH

次のように入力して、既知のディレクトリsftpで が利用可能かどうかを確認します。PATH

which sftp

シェルプロンプトで。プログラムの場所で応答する必要がありsftpますが、見つからない場合はまったく応答がありません。見つからない場合は、自分で見つけて、その場所 (厳密には、プログラムを含むディレクトリ) をPATH. 次のようなプログラムを見つけます。

locate sftp

または(非常に遅い!):

find / -name sftp -print

にディレクトリを追加するにはPATH、シェルで次のようにします。

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

Expect スクリプト内にディレクトリを追加することもできます (もちろん、 の前にある限りspawn!):

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

Windows の操作PATH

WindowsならWindowsサーチ( Windows+ FIIRC)を使っsftp.exeて(コマンドライン検索ツールもありますが使い方忘れました)というファイルを探します。

Windows PATH では、もう少し注意が必要です。

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

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

つまり、WindowsPATHは別の区切り文字を使用し (:ドライブ名をディレクトリ部分から分離するために使用されるため)、やや便利なスラッシュのバリエーション (バックスラッシュ) ではなく、ディレクトリのネイティブ名を使用する必要があります。 Tcl の構文と相互作用するため、{中かっこ})。file nativename私の2番目のバージョンのように、追加する前に変換するために使用する場合は、スラッシュを使用できます。

役立つ Tcl テクニック

Tcl コマンドauto_execokを使用して、プログラムがインストールされているかどうかを確認できますPATH。例えば:

puts [auto_execok sftp]

ただし、一部のコマンド (特にstartWindows) では、より複雑な応答が得られます。このコマンドは、インタラクティブな Tcl の使用をサポートするコードの一部として実際に存在し、一見したよりもはるかに複雑な外部プログラムを実行する方法を記述しています。whichそれでも、この回答の冒頭に記載されているクロスプラットフォーム バージョンに近似しています...

Tcl 8.6 では、要素区切り文字 (プラットフォームに応じてaまたは)$tcl_platform(pathSeparator)を取得する方法として variable が提供されています。ただし、8.6 は以前のバージョンほど広く配布されていないため、おそらく役に立たないでしょう。PATH:;

于 2012-11-26T10:43:31.283 に答える