« Tcl: CommentiAppunti di Tcl/TkTcl: Variabili »

Tcl

Esecuzione dei programmi Tcl (in UNIX)

Ci sono due modi per eseguire un programma Tcl: digitarlo interattivamente linea per linea al prompt di tclsh(1) o wish(1) oppure salvarlo in un file e passare il nome del file come argomento ad una delle suddette shell:

$ tclsh hello.tcl
$ wish hello.tcl

Fino alla sezione su Tk, i nostri programmi non saranno grafici, perciò è sufficiente usare tclsh(1).

Per uscire dalla shell tclsh(1) usate il comando Tcl exit(n) o premete ^D in UNIX.

Una variante del metodo di invocare l'interprete su uno script, consiste nell'utilizzare una funzionalità del caricatore dei programmi di UNIX. Se la prima linea di uno script di cui viene richiesta l'esecuzione inizia con il commento speciale #!interpreter dove interpreter rappresenta il percorso completo dell'interprete, questo equivale a chiedere l'esecuzione dell'interprete a cui viene passato come parametro proprio il nome del file che si vuole eseguire:

#!/usr/local/bin/tclsh
puts "Hello World"

Per rendere eseguibile uno script usate chmod(1) ($ esemplifica il prompt della shell di UNIX usata):

$ chmod u+x hello.tcl
$ ./hello.tcl
Hello World

Questo è utile per un utente del vostro programma perché semplifica l'invocazione, infatti basta indicare il nome del file script da eseguire, però presenta un problema: il percorso dell'interprete potrebbe essere diverso da installazione ad installazione. Un utente che non ha installato tclsh nel percorso specificato otterrà uno spiacevole messaggio di errore:

$ ./hello.tcl 
bash: ./hello.tcl: /usr/local/bin/tclsh: bad interpreter: No such file or directory

Per ovviare all'inconveniente, evitiamo di indicare il percorso completo dell'interprete, facendo affidamento sul fatto che l'interprete si trova nel percorso di ricerca di default predisposto all'invocazione della shell sh(1):

#!/bin/sh
# \
exec tclsh "$0" "$@"

puts "Hello World"

Questo codice è molto trucchettoso e funziona perché anche Tcl, come la shell sh, prevede l'uso del carattere # per indicare un commento fino alla fine della linea; tuttavia mentre la sh ignora il carattere di continuazione di linea \ nei commenti, Tcl lo interpreta, percui Tcl ignora l'istruzione exec, considerandola come parte di un commento, mentre sh no. Infine sh ignora il programma Tcl che segue la exec, perché exec sostituisce il processo che esegue la shell con l'interprete Tcl. Il parametro speciale $0 viene espanso nel nome dello script di shell e siccome è tra apici doppi costituirà sicuramente un argomento singolo. Il parametro speciale $@ viene espanso con tutti gli eventuali parametri posizionali che si erano forniti dopo il nome del file da eseguire. Quando $@ viene espanso tra i doppi apici, ogni singolo parametro-posizione viene espanso in un argomento singolo, e questo assicura che esattamente gli stessi parametri usati dopo il nome dello script vengano trasmessi a tclsh(1). La shell sh è ben descritta dalla manpage di sh(1). Questo trucco di cui abbiamo parlato è descritto anche nella sezione SCRIPT FILES della pagina di manuale wish(1).

Se usate FreeBSD, dovete sostituire tutte le invocazioni a tclsh con tclsh seguito dal numero di versione, poiché in questo sistema è possibile installare diverse versioni di Tcl. In tal caso tclsh è stato sostituito con uno script di shell che ricerca le versioni installate, stampa un messaggio di avvertimento e indica i comandi per caricare ciascuna versione. Ad esempio:

$ tclsh
In FreeBSD, tclsh is named with a version number.  This is because
different versions of tclsh are not compatible with each other and
they can not all be called "tclsh"!  You may need multiple versions
installed because a given port may depend on a specific version.

On your system, tclsh is installed under at least the following names:

tclsh8.3
tclsh8.4

« Tcl: CommentiAppunti di Tcl/TkTcl: Variabili »