exec не работает в ожидаемом сценарии

#exec #tcl #expect

#exec #tcl #ожидать

Вопрос:

Я пишу свой первый expect script, поэтому, возможно, я упускаю что-то очевидное, но я нахожу следующее довольно загадочным:

 $ expect
expect1.1> exec echo a
a
expect1.2>
$ cat > test.exp
exec echo a
$ expect test.exp
$
  

Если я запускаю expect и заставляю его выполнять что-то вручную, это работает. Если я помещу ту же команду в скрипт, это не сработает. Что происходит?

Ответ №1:

Обратите внимание, что expect по сути является расширением Tcl. Tcl exec выполняет внешнюю команду, захватывает выходные данные и возвращает их в виде значения — он не отправляет его в стандартный вывод, если вы не проинструктируете его об этом. Однако интерактивный сеанс Tcl (или expect) выводит выходные данные в стандартный вывод для удобства.

Ваш сценарий должен быть:

 puts [exec echo a]
# or
set output [exec echo a]
puts $output
  

Я предполагаю, что «echo a» является заполнителем для более сложной внешней команды. Если вы просто хотите что-то напечатать:

 puts "this is something"  ;# the Tcl way
send_user "this is toon" ;# the expect way
  

Если вы новичок как в Tcl, так и в expect, то вам следует сначала изучить Tcl.

Комментарии:

1. Спасибо за объяснение. Вы правы, я тоже новичок в Tcl. Если быть предельно честным, я не стремлюсь научиться программировать на Tcl; я просто хотел решить практическую проблему, и expect показался мне подходящим инструментом для этой работы. Возможно, такого рода усилия больше подходят для superuser.com .

2. @LaC, я предложил изучить Tcl (это не займет много времени), потому что это тонны облегчит ваше ожидаемое программирование.

3. Еще одна вещь: не завершайте команду с помощью «». В противном случае произойдет сбой. По крайней мере, в моем случае это не удалось.