Для приложения для тестирования оборудования мне необходимо запустить несколько внешних cli-приложений и взаимодействовать с ними, например, Linux-пинг на определенный локальный IP-адрес из скрипта Tcl/Tk.
В Windows 7 (и XP тоже, пару лет назад) я делал это в среде Cygwin, используя Tcl8.5 и Expect 5.45 Cygwin, с большим успехом. Я мог вызвать bash, а затем общаться с 'ping', 'ls', 'touch' и несколькими другими инструментами, используя команды tcl expect. Когда я затем закрываю bash с помощью 'exit', процесс оболочки завершается, и я мог повторять это с другими командами столько раз, сколько требовалось.
В Linux (Debian Stretch) те же самые скрипты tcl/tk работают как часы, включая взаимодействие с любыми внешними приложениями.
Теперь, согласно политике компании, я должен запустить все это под управлением Windows 10. Я прочитал об этом, обсудил с коллегами и установил на свой компьютер подсистему Windows для Linux (WSL) с образом Ubuntu 18.04 wsl, а также ActiveState Tcl 8.5 (версия для Windows) и Expect 5.45 через Teapot.
Сами скрипты Tcl работают как и ожидалось, включая желаемый графический интерфейс, последовательную связь и даже связь по Ethernet с/от встроенного оборудования тестируемого устройства, но я по-прежнему не могу запустить и взаимодействовать с внешними программами, такими как ping и некоторые другие приложения Linux CLI, используя интерфейс wsl.exe.
Если я запускаю wsl.exe вручную, щелкнув в проводнике Windows или из командной оболочки (Windows CMD-), я получаю приглашение bash в виртуальном терминале и могу вводить все необходимые команды инструмента в интерактивном режиме, как и ожидалось.
Но как бы я ни пытался запустить wsl.exe из моих скриптов Tcl, используя команду (Expect-) 'spawn' или даже просто:
exec C:\\Windows\\system32\\wsl.exe $lnxcmd $params ,
Я получаю либо сообщение «файл не найден» для wsl.exe, либо вообще никакого ответа.
В чем заключается трюк, как запустить wsl.exe и запустить программу Linux из скрипта Tcl, работающего в домене Windows, «программно» и взаимодействовать с ним (stdin/stdout/stderr обрабатываются Expect)?
Даже вызов «% dir C:\Windows\system32\ws*.exe» из командной строки %-shell интерпретатора Tcl (tclsh85 или wish85) не выдает ни одного результата, хотя файл WSL.EXE определенно присутствует в этой системной папке Windows?
решение1
Но как бы я ни пытался запустить wsl.exe из моих скриптов Tcl, используя команду (Expect-) 'spawn' или даже просто:
exec C:\Windows\system32\wsl.exe $lnxcmd $params ,
Я получаю либо сообщение «файл не найден» для wsl.exe, либо вообще никакого ответа.
Возможно, ваш путь неверен, я не использую Tcl/tk, но из того, что я здесь прочитал:https://www.tcl.tk/man/tcl8.3/TclCmd/имя_файла.htm#M26 Вы не очень хорошо описываете свой путь.
Более того, если вы хотите передать команду linux в wsl, я предлагаю использовать параметр -e:wsl -e ping 192.168.1.1