Как заставить tclsh игнорировать EOF? - PullRequest
3 голосов
/ 02 сентября 2010

В csh вы можете сделать

set ignoreeof

или в bash tou можно сделать

export ignoreeof=1

и это заставит csh / bash игнорировать EOF, т. Е. Он не завершится при нажатии Ctrl + D или при достижении конца или файла.

Есть ли способ сделать то же самое с tclsh?

Есть ли способ заставить tclsh не выходить при достижении конца файла?

Ответы [ 4 ]

1 голос
/ 03 сентября 2010

Если tclsh запускает скрипт, он не завершается при обнаружении EOF на stdin;это чисто особенность встроенного REPL.Вы можете обнаружить такое состояние самостоятельно, используя eof stdin, после чего вы можете решить, что с ним делать.

Если вы хотите сделать Ctrl + D не будьте EOF, тогда ваш самый простой способ - перевести терминал в режим raw, например:

set sttySettings [exec stty -g <@stdin]
exec stty -echo raw <@stdin

Когда вы закончите, переключитесь обратно так:

exec stty $sttySettings <@stdin

Убедитесь, что вы переключаетесь обратно до выхода из программы!

Другое дело, что если вы работаете с необработанным вводом, вам придется самостоятельно обрабатывать все строки.Удобный способ сделать это - использовать чистую Tcl-подобную систему Tcl , такую ​​как этот пример из вики Tcler .Возможно, вам придется немного его изменить, чтобы Ctrl + D делал то, что вы хотите.

Альтернативой является то, что оставляет все в готовом режиме и просто Ctrl + D не является специальным (проверено на OSX):

exec stty eof "" <@stdin

Опять же, вам нужно вернуть все обратно при выходе и тот факт, что этоне особенное вообще может вызвать проблемы в другом месте;после вышеописанного трюка это обычный персонаж.

1 голос
/ 03 сентября 2010

Возможно, вы захотите Expect: сохраните его как tclsh.exp

#! /usr/bin/env expect
log_user 0
spawn tclsh
if {[llength $argv] > 0} {
    send -- "set argv [list [lrange $argv 1 end]]; source [lindex $argv 0]\r"
}
interact

, затем запустите tclsh.exp somefile.tcl arg arg ...

0 голосов
/ 02 сентября 2010

В tclsh такой встроенной функции нет.

0 голосов
/ 02 сентября 2010

Возможно, вы сможете использовать команду trap из TclX.

...