Tcl/Tkの起動と実行方法について

利用環境がUnixの場合

メモ

Mac OS XもUnix環境と同じ操作になります。

事前準備

以下の作業は必須ではないので必要に応じて実施してください。

(1)Tcl/Tk用のディレクトリを作成

自分のホームディレクトリにTcl/Tk用のディレクトリを作る。

$ mkdir tcl-tk

(2)シンボリックリンクの作成

シンボリックリンクの作り方

実行例

# cd /usr/local/bin
# ln -s tclsh8.5 tclsh
# ln -s wish8.5 wish
シンボリックリンクを作成する理由

シンボリックリンクを作成する理由について、補足説明します。

シンボリックリンク(ソフトリンク)はWindowsのショートカットのようなもので、実体へのファイルパスを保存しているファイルです。

Tcl/Tkのインストール先は、使用環境によって違います。デフォルトでは/usr/local以下にインストールされます。

また、Tclの実行ファイルはtclsh8.5、wish8.5のようにリリース番号付きでインストールされます。この場合、8.5→8.6のようにリリース番号の違うTcl/Tkに更新すると、すべてのスクリプトファイルで指定するプログラム名を変更する必要が生じます。

例.スクリプトファイルの1行目

#!/usr/local/bin/tclsh8.5

    ↓↓↓↓↓ 変更が必要

#!/usr/local/bin/tclsh8.6

すべてのファイルを変更するのは大変なので、これを避けるためにlnコマンドでシンボリックリンクを作っておくと便利です。

シンボリックリンク「tclsh」を作成した場合、スクリプトファイルの1行目を

  #!/usr/local/bin/tclsh

と記述しておけば、リリース番号の違うTcl/Tkに更新しても、シンボリックリンクを再設定するだけで済みます。

(3)パスの設定

UNIXではパス設定されていないディレクトリの中にあるプログラムを実行するには、プログラム名の先頭に「./(ドットスラッシュ)」を付けて実行する必要があります。

「./」を付けずに実行させたい場合は、プログラムファイルを保存しているディレクトリのパス設定を行います。

[パス設定]
・Cシェル系(.cshrc .tcshrcなど)
   set path = ($path $HOME/tcl-tk)
・Bシェル系(.profile .bashrcなど)
   PATH=$PATH:$HOME/tcl-tk

Tclシェルの起動・実行・終了の方法

Tclの起動およびTclコマンドを対話的に実行するには以下のように実施します。

  1. 端末画面から tclsh を入力する。
  2. プロンプトが 「%」に変わり、対話的に実行可能な状態になります。
  3. Tclシェルを終了するには exitコマンドを入力します。

[使用例 : hello, world! と表示する]

$ tclsh
% puts "hello, world!"
hello, world!
% exit
$
  • tclshの名前は環境によりtclsh8.5などリリース番号付きになっています。
  • 端末画面はデスクトップマネージャの種類により、ターミナルやコンソールという名前になっています。

ボタンなどのGUI(Tk)のコマンドを入力する場合は 「tclsh」ではなく「wish」を起動させますが、GUIの操作を対話的に実行させることは少ないと思います。

プログラムファイルを実行する

Tclのプログラムファイルを実行するには以下のようにします。

[サンプルプログラム : hello.tcl]

#!/usr/local/bin/tclsh

# hello.tcl

puts "hello, world!"
  • UNIXでは、ファイルの1行目が「#!パス名」で始まっていると、そのパス名で指定されたアプリケーションを実行します。
  • 実際のパス名は使用する環境によって異なっている可能性があります。

プログラムファイルを実行させるには、まず、Tclコマンドで手続きを記述したファイルをテキストエディターで作成します。サンプルの hello.tcl は画面に hello,world! を出力するプログラムです。

2行目以降「#」で始まる行はコメント行です。記述しても無視されるので、プログラムに影響は与えません。

実行方法は以下のような方法があります。

(1)tclshの引数にファイル名を指定して起動する

実行例 :

$ tclsh hello.tcl
hello, world!
$

(2)tclsh起動後にsourceコマンドで読み込む

実行例 :

$ tclsh
% source hello.tcl
hello, world!
%

(3)独立したアプリケーションとして実行する

通常はこの方法で実行します

  • chmodコマンドで実行許可を与える。(1回のみ実施)
  • プログラムの実行。

実行例 :

$ chmod +x hello.tcl
$ hello.tcl または ./hello.tcl
hello, word!
$ 

(4)Windowプログラムを実行する

messageコマンドを使うとWindow画面に文字列を表示できます。

[サンプルプログラム : hello-w.tcl]

#!/usr/local/bin/wish

# hello-w.tcl

message .msg -width "200" -text "hello, world!"
button .btn -text "終了" -command exit
pack .msg .btn

実行例 : hello-w.tclの実行方法

$ hello-w.tcl &
$

プログラム名の後ろに「&」を付けて実行すると、バックグランドプロセスとして実行されます。「&」を付けずに実行するとフォアグランドプロセスとして実行されるためウィンドウを閉じるまでは端末のコマンドライン操作ができません。

実行すると下記のようなウィンドウプログラムが起動します。

スクリプトファイルの1行目について

UNIX系OSの中には、スクリプトファイルの特別な1行目の長さを制限しているものがあり、パス名の長さがこの制限を越えると文法エラーとなり起動できません。また、環境により、tclsh,wishの場所も違います。

これを回避する方法として、Tclでは以下の記述方法が推奨されています。

サンプルプログラム : hello.tcl

#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"

puts "hello,world!"

この方法はshとTclのコメントの解釈の違いを利用しています。

  1. 1行目で sh が起動される。
  2. 2行目はコメントとして扱われる。末尾の 「\」 は sh では次の行への継続記号として扱われない。
  3. execコマンドで処理が sh から tclsh へ移る。

shの機能として
“$0” にスクリプトのファイル名が格納される。
“$@” にファイル名の後に記述した引数が格納される。

  1. Tclでは、末尾に「\」があると、次の行に継続されます。よってtclshへ移った後、3行目の exec は2行目のコメントの継続行として扱われるので無視されます。
  • 継続記号は日本語環境では「¥(円マーク)」ですが、英語環境では「\(バックスラッシュ)」です。
  • このスクリプトファイルをWindowsで実行すると1,2,3行目すべてコメントとしてみなされます。

shのいくつかのバージョンには、引数がない場合に「”$@”」を1つの空の引数に展開する不具合があるようで、「”$0″ “$@”」よりも以下の記述のほうがいいようです。

  exec tclsh “$0″ ${1+”$@”}

ところで、RubyやPythonでは、以下のような記述を見かけます。

  「#!/usr/bin/env ruby」、「#!/usr/bin/env python」

Tclでも同じように「#!/usr/bin/env tclsh」を使うことができます。ですが、env のない環境や、以下のように引数があると、引数の解釈が環境により違うようなので、やっぱり、exec を使う方法がお勧めだそうです。

  !/usr/bin/env tclsh aaa bbb ccc

[参考:exec magicの元ネタ]

exec magic
Tclers wiki

コメント

タイトルとURLをコピーしました