[ é especial no TCL e "..." interpola, então
"blah [foo]"
faz com que o TCL tente chamar o procedimento foo ( proc ou o que outros idiomas chamam de sub ou function ). Alguém pode voltar a usar o [
expect "blah \[foo]"
ou, em vez disso, cite com {} , o que desativa a interpolação
expect {blah [foo]}
Essas são as opções sãs. Não use nenhum código além desse ponto!
O Ministério da Silly Procs
Também podemos criar um proc que faz com que uma chamada para Y/n retorne [Y/n] ;
$ expect
expect1.1> proc Y/n {} { return "\[Y/n]" }
expect1.2> puts "abort [Y/n]"
abort [Y/n]
expect1.3>
isso permite que [Y/n] opere dentro de uma string interpolada. Ainda mais problemas podem ser obtidos via unknown(n) , pois isso nos permite criar um proc para a maioria de qualquer string aleatória [...] interpolada em qualquer lugar ... a menos que um proc já exista para o nome do procedimento dado; como eu disse anteriormente, esta é uma má ideia e não deve ser usada.
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>