[
является специальным в TCL, а "..."
интерполирует, поэтому
"blah [foo]"
заставляет TCL пытаться вызвать процедуру foo
(proc
или то, что другие языки могут вызывать sub
илиfunction
). Можно либо ударить[
expect "blah \[foo]"
или вместо этого укажите {}
, который отключает интерполяцию
expect {blah [foo]}
Это разумные варианты. Не используйте код дальше этой точки!
Министерство глупых дел
Мы также можем создать proc
, который заставляет вызов Y/n
возвращать [Y/n]
;
$ expect
expect1.1> proc Y/n {} { return "\[Y/n]" }
expect1.2> puts "abort [Y/n]"
abort [Y/n]
expect1.3>
это позволяет [Y/n]
работать в интерполированной строке. Еще больше проблем можно получить с помощью unknown(n)
, так как это позволяет нам создать proc
для большей части любой случайной строки [...]
, интерполированной где угодно... если, конечно, proc
уже не существует для данного имени процедуры; как я уже говорил ранее, это плохая идея и не должна использоваться.
expect1.1> proc unknown args { return "\[$args]" }
expect1.2> puts "abort [Y/n]"
abort [Y/n]
expect1.3> puts "already exists [puts -nonewline puts\ ]"
puts already exists
expect1.4>