1

コマンドインタープリターとしてTCLを利用したいプロジェクトに取り組んでいます。tclシェル内からロードできる作業中のcライブラリオブジェクトがありますが、私の問題は、tclshの起動中にこれを自動的に行う方法を見つけることです。

基本的に、私の最終的な目標は、スクリプトを実行してライブラリをロードし、初期起動tclコードを実行してから、インタラクティブモードでtclshコマンドプロンプトに戻ることです。

例えば

tclsh -f myscript.tcl --then-switch-to-interactive

また

EXPORT TCLINIT=myscript.tcl 
tclsh 

基本的な目標は、tclshを配布する必要をなくし、tclのローカルユーザーインストールに依存することです。配布したいのは、ライブラリ、起動スクリプト、およびライブラリがプリロードされた状態でtclshを起動するためのシェルコマンドだけです。

環境変数を使ってみましTCLINITTCL_LIBRARYが、効果がないようです。

/usr/share/tcltk/tcl8.5.init.tcl私がこれまでに見つけた唯一の実行可能な解決策は、またはの最後に「sourcemyscript.tcl」を追加することです。~/.tclshrc

ただし、これらの「ソリューション」はどちらも、デフォルトのユーザーワークスペースを変更する必要があるため、完全ではありません。

TCLでこれを処理する方法があるはずだと私は思いますが、これまでの私の研究では何も得られていません。

誰か提案はありますか?

4

2 に答える 2

0

Tcl には、 を置き換える機能はありませんinit.tclユーザーまたはライブラリコードを実行する前に、言語の一部をセットアップするために使用されます。調整されるのは、tclkit(内部仮想ファイルシステムを初期化するためにそこで余分な作業を行う) ようなパッケージング システムの場合のみです。

また、ユーザーの編集をユーザーに依存することも~/.tclshrc勧めしません。また、非対話的に実行している場合は決してソース化されません (コードを追加して実際に読み取る場合を除きます)。

代わりに、次のことを検討することをお勧めします。

  • ライブラリを Tcl パッケージとして配布/インストールするため、必要なコードは次のように実行できます。

    package require itsname
    

    そのように、それを必要とするコードは事実を宣言するだけでよく、そうでないコードは影響を受けません。

  • 対話型シェルとして機能するスクリプトを使用してライブラリを配布/インストールします。ここではTclX パッケージcommandloopのコマンドが役立つかもしれませんが、その Wiki ページには独自のコードもあります。

于 2012-09-19T08:55:31.697 に答える
0

myscript.tcl:

package require Tclx
# Your script
commandloop; # Start interactive session
# other commands

このcommandloopコマンドは、対話型コマンド ループを作成します。この時点で、ユーザーが と入力exitすると、スクリプトはその行に続く他のコマンドを実行せずに終了しますcommandloop。一方、ユーザーが Crtl+D または Ctrl+Z を入力して を終了するcommandloopと、他のコマンドが実行されます。

参照先commandloop: http://wiki.tcl.tk/1968

カスタムプロンプト

デフォルトのプロンプトが気に入らない場合は、 を作成しprocてカスタム プロンプトを返し、それを に渡しますcommandloop

proc customPrompt {} { return "tcl> " }
commandloop -prompt1 customPrompt
于 2012-09-19T14:28:54.760 に答える