#linux #shell #tcl
#linux #оболочка #tcl
Вопрос:
Я новичок в языке TCL и хотел бы использовать сценарии, которые я пишу, для автоматизации некоторых простых задач, которые я обычно выполняю в интерфейсе терминала Linux (или какой-либо другой оболочке). Моя цель прямо сейчас — иметь возможность просто запустить терминал (я использую ubuntu, поэтому команда gnome-terminal), а затем иметь возможность отправлять команды этому экземпляру терминала.
Мои первоначальные мысли были о том, что я мог бы просто сделать что-то вроде этого :
set myTerminal [open |gnome-terminal r ]
puts $myTerminal "a command"
flush $myTerminal
и что это приведет к удалению символов в терминал. Однако ничего не происходит, и я не уверен, как поступить. Большое спасибо за вашу помощь!
Редактировать: я бы особенно хотел использовать терминал для запуска программ, имеющих интерфейс командной строки. Идея заключалась в том, что я мог бы запустить терминал с помощью tcl, затем дать терминалу команду для запуска этой программы и, наконец, использовать терминал в качестве посредника между сценарием tcl и программой командной строки. Чтобы предположить, я использую tcl для управления терминалом, который, в свою очередь, управляет программой командной строки.
Комментарии:
1. Зачем вам нужно окно терминала? Вам нужен дисплей или что-то еще?
2. Учитывая ваше разъяснение, expect, к сожалению, не будет работать для вас.
3. Вам нужен новый терминал, или будет достаточно управления текущим терминалом?
4. @glennjackman — О, это хороший момент. Управлять текущим терминалом намного проще.
Ответ №1:
Вы должны использовать expect. Это стандарт. Он скрывает большинство особенностей оболочки, с которыми вы столкнетесь, если будете делать это вручную.
Он написан на TCL и был создан для того, чтобы делать именно то, что вы хотите.
Expect — это инструмент автоматизации и тестирования Unix, написанный Доном Либесом как расширение языка сценариев Tcl для интерактивных приложений, таких как telnet, ftp, passwd, fsck, rlogin, tip, ssh и другие. Он использует псевдотерминалы Unix для прозрачного завершения подпроцессов, позволяя автоматизировать произвольные приложения, к которым осуществляется доступ через терминал.
Комментарии:
1. Технически Expect написан на C и состоит из набора (очень умных) команд расширения для Tcl (т. Е. пакета Tcl). Он также включает (по историческим причинам) команду Unix, которая запускает комбинацию Tcl Expect .
Ответ №2:
Это будет намного сложнее, чем кажется на первый взгляд. Чтобы достичь того, чего, похоже, вы пытаетесь достичь сейчас, вам нужно будет создать программу, которая запускает псевдотерминал и запускает оболочку внутри него. Затем вам нужно будет заставить gnome-terminal
открыть окно, в котором запущена ваша программа.
Это будет довольно сложная операция, и вам нужно будет написать вспомогательную программу для ее выполнения. Вам также, вероятно, потребуется использовать expect, но вам придется использовать его для запуска вспомогательной программы.
Я бы не удивился, узнав, что программа, которая делает то, что делает вспомогательная программа, уже существует, но я бы не удивился, узнав, что это не так. Возможно, вам захочется ознакомиться с openpty
и forkpty
, хотите ли вы написать это самостоятельно. Я не думаю, что вы можете с пользой вызывать их из TCL, но вы можете из perl или Python.
Комментарии:
1. Tcl всегда использовал Expect для обработки pty, поскольку Expect была (IIRC) первой программой, использующей Tcl в универсальной форме (до этого, я думаю, она использовалась просто как встроенная библиотека). Программа tclsh появилась позже (благодаря успеху Expect).