2010-09-02 4 views
2

В CSH вы можете сделатьКак сделать tclsh игнорировать EOF?

set ignoreeof 

или Баш УИ может сделать

export ignoreeof=1 

и это сделает CSH/Баш игнорировать EOF, то есть он не будет выходить на Ctrl + D, или когда он достигает конца или файла.

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

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

+0

Вы хотите сказать ignore^D в интерактивной сессии tclsh? –

+0

На самом деле я хочу, чтобы tclsh не выходил, когда я звоню tclsh something.tcl. Игнорирование^D в интерактивном сеансе даст решение для этого – Vahagn

+0

Ознакомьтесь с последним комментарием Брайана Окли на .tclsh - это похоже на то, что вы хотите. –

ответ

0

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

+0

Это для обработки сигналов, конец файла не является сигналом. –

+0

Возможно, вы все же хотите использовать 'trap', даже если просто вернуть терминал в нормальное состояние на реальном сигнале, таком как SIGINT или SIGTSTP. –

0

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

+0

то как я могу его реализовать? – Vahagn

+0

@vahagn: зачем вам это нужно? Какую проблему ты пытаешься решить? –

+0

@ Bryan Oakley: Я разрабатываю среду оболочки на основе tclsh, и при запуске этой среды мне нужно сделать некоторые инициализирующие материалы. Поэтому мне нужно, чтобы tclsh вывел какой-то init.tcl и остался на интерактивном сеансе (чтобы не выходить из него при чтении^D в конце файла init.tcl). – Vahagn

1

Вы можете ожидать: сохранить это как 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

Хм, нисходящее ... позвольте мне отредактировать. –

1

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

Если Вы желаете сделать Ctrl +D не будет EOF, то ваш самый простой способ поставить терминал в нестандартном режиме, как это:

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

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

exec stty $sttySettings <@stdin 

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

Другое дело, что если вы работаете с сырым входом, вам придется обрабатывать все редактирование строк самостоятельно. Удобный способ сделать это - использовать чистую систему Tcl, подобную readline-such as this example from the Tcler's Wiki. Возможно, вам придется немного приспособить его, чтобы сделать Ctrl + D делать то, что вы хотите.

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

exec stty eof "" <@stdin 

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

Смежные вопросы