外部コマンド

Tclは、Tclのコマンド以外を与えられると外部のコマンドを実行します。
実行された外部コマンドの標準出力はTclのコマンドと同様にコマンドの値として返されます。

# grepは外部コマンドです。
grep -n hoge *.c | wc

このことを知って使う分には便利なんですが、知らないとすべてTclのコマンドだと
錯覚してしまい、スクリプトを他のプラットフォームに移植した時に問題になることがあります。
外部コマンドの実行を禁止するには、auto_noexec変数を作成します。
Tclは、auto_noexec変数が存在すると、外部コマンドを実行せずにエラーを返します。

# 変数の値はなんでも良い。
set auto_noexec 1

grep -n hoge *.c | wc
invalid command name "grep"

execコマンド

execコマンドは、外部のコマンドを実行するのに使います。
execコマンドは、auto_noexec変数の存在には関係なく、外部コマンドを実行します。

# grepは外部コマンドです。
exec grep -n hoge *.c | wc

外部コマンドは、UNIXのShellで実行する時のように、標準入出力のリダイレクトやパイプラインに対応しています。
また、globコマンドの正規表現を使ってファイル名を指定することもできます。

execコマンドの構文
-keepnewlineコマンド出力のニューラインを削除しません。第1引数に指定する。
--オプションの最後を表します。
|コマンドの標準出力をパイプラインでつなぎます。
|&コマンドの標準出力と標準エラー出力をパイプラインでつなぎます。
< fileName指定したファイルから入力します。
<@ fileId指定したファイルストリームから入力します。
<< value指定した文字列を入力します。
> fileName標準出力を指定したファイルに出力します。
2> fileName標準エラー出力を指定したファイルに出力します。
>& fileName標準出力と標準エラー出力を指定したファイルに出力します。
>> fileName標準出力を指定したファイルに追記します。
2>> fileName標準エラー出力を指定したファイルに追記します。
>>& fileName標準出力と標準エラー出力を指定したファイルに追記します。
>@ fileId標準出力を指定したファイルストリームに出力します。
2>@ fileId標準エラー出力を指定したファイルストリームに出力します。
>&@ fileId標準出力と標準エラー出力を指定したファイルストリームに出力します。
&コマンドをバックグランドで実行します。コマンドの最後に指定する。

execコマンドの構文の使用例です。

grep -n hoge *.c | wc >& log.txt &

exec grep -n hoge *.c | wc >& log.txt &

Windowsの例

Windows環境でも外部コマンドとして、DOS, Win16, Win32, Cygnus等のコマンドを実行できます。
ただし、お行儀の悪いプログラムを実行するとTclが暴走するので注意が必要です。

Windows環境では、ファイルの拡張子にアプリケーションがバインドされているので、
それを応用すると、Webブラウザを立ち上げてHTMLファイルを開くのも簡単にできます。

# CMD.COM経由でWebブラウザを起動する。
exec $env(COMSPEC) /c start index.html &

注意としては、一部のWindowsの版で問題になるので、
HTMLファイル名のパスは、file nativenameコマンドを使ってWindowsネーティブパス(\でセパレート)に変換して渡した方が安全です。