ハードウェア テスト アプリケーションの場合、Tcl/Tk スクリプト内から、特定のローカル IP アドレスへの Linux ping など、いくつかの外部 CLI アプリケーションを実行して対話する必要があります。
Windows 7 (および数年前の XP) では、Cygwin 環境で、Cygwin の Tcl8.5 と Expect 5.45 を使用してこれを実行しましたが、うまくいきました。bash を起動し、tcl の expect コマンドを使用して、「ping」、「ls」、「touch」、およびその他のいくつかのツールと通信できました。その後、「exit」で bash を閉じると、シェル プロセスが終了し、必要に応じて他のコマンドでこれを繰り返すことができました。
Linux (Debian Stretch) では、同じ tcl/tk スクリプトが、外部アプリとのやり取りも含めて、問題なく実行されます。
現在、会社の方針により、これらすべてを Windows 10 で実行する必要があります。同僚と話し合い、Ubuntu 18.04 wsl イメージを使用して Linux 用の Windows サブシステム (WSL) を自分のマシンにインストールし、teapot 経由で ActiveState Tcl 8.5 (Windows バージョン) と Expect 5.45 もインストールしました。
Tcl スクリプト自体は、wish GUI、シリアル通信、さらには DUT 組み込みハードウェアとの間のイーサネット通信を含めて期待どおりに実行されますが、wsl.exe インターフェイスを使用して、ping やその他の Linux CLI アプリなどの外部プログラムを起動して通信することはできません。
Windows エクスプローラーでクリックするか、(Windows CMD-) コマンド シェルから wsl.exe を手動で起動すると、仮想端末に bash プロンプトが表示され、期待どおりに必要なすべてのツール コマンドを対話的に入力できます。
しかし、Tcl スクリプト内から wsl.exe を起動しようとすると、(Expect-)「spawn」コマンドを使用するか、単に次のようにします。
C:\\Windows\\system32\\wsl.exe $lnxcmd $params を実行します。
wsl.exe に対して「ファイルが見つかりません」というメッセージが表示されるか、まったく応答がありません。
wsl.exe を実行し、Windows ドメインで実行されている Tcl スクリプト内から Linux プログラムを「プログラム的に」実行し、それと対話する (Expect によって処理される stdin/stdout/stderr) ための秘訣は何ですか?
Tcl インタープリターの %-shell プロンプト (tclsh85 または wish85) 内から呼び出された '% dir C:\Windows\system32\ws*.exe' でも、ファイル WSL.EXE が Windows システム フォルダー内に確実に存在しているにもかかわらず、結果が 1 つも表示されません。
答え1
しかし、Tcl スクリプト内から wsl.exe を起動しようとすると、(Expect-)「spawn」コマンドを使用するか、単に次のようにします。
C:\Windows\system32\wsl.exe $lnxcmd $params を実行します。
wsl.exe に対して「ファイルが見つかりません」というメッセージが表示されるか、まったく応答がありません。
おそらくあなたのパスは間違っているでしょう。私は Tcl/tk を使用していませんが、ここで読んだところによると:https://www.tcl.tk/man/tcl8.3/TclCmd/ファイル名.htm#M26 あなたのパスの書き方は良くありません。
さらに、wsl で Linux コマンドを実行する場合は、 -e パラメータを使用することをお勧めします。wsl -e ping 192.168.1.1