28 mayo 2006

El intérprete de comandos Tcsh


Tcsh es un intérprete de comandos para Unix compatible con el intérprete csh. Está disponible gratuitamente en aquí, se distribuye bajo licencia BSD y tiene una sintaxis similar a la de C. Es el intérprete por defecto en FreeBSD y de otros sistemas Unix, también está disponible en muchas distribuciones de Linux.

Voy a comentar algunos aspectos menos conocidos de Tcsh. El intérprete tiene muchas más posibilidades que no comento en el texto (historial, pila de directorios...), sólo voy a hablar de las características que más utilizo. Posiblemente muchas estas características están disponibles en otros intérpretes como GNU Bash o Zsh. Para conocer más a fondo todo lo referente a Tcsh, lo mejor es su página de man.

Autocompletar

Tcsh autocompleta los nombres de fichero y directorios con la tecla TAB. Por defecto no muestra la lista de posibles nombres de fichero como hace GNU Bash, para que se muestre la lista hay que definir la variable autolist.

% set autolist

% cd EDA/[TAB]
libJava/ progJava/
% cd EDA/li[TAB]
% cd EDA/libJava

Tcsh también completa nombres de variables del shell.

% echo $h[TAB]
history home
% echo $ho[TAB]
% echo $home

Y logins de usuarios del sistema:

% echo ~n[TAB]
news nfsnobody nobody nscd ntp
% echo ~ne[TAB]
% echo ~news

Las variables listmax y listmaxrows se pueden definir y limitan el nmero de posibilidades que autolist muestra.

% set listmax=10
% cd ~[TAB]
Existen 1024 ítems, listarlas de todos modos? [n/s]

Qué más se podría autocompletar? Tcsh también permite autocompletar parámetros en la líea de comandos.

Esta característica requiere que configuremos previamente cómo queremos que se autocomplete cada comando. Para ello utilizamos el comando complete.

En este ejemplo indicamos que complete el comando ssh con alguna linea del fichero .hosts.

% complete ssh 'p/1/`cat ~/.hosts`/'
% ssh [TAB]
192.168.1.100 alien3.dsic.upv.es localhost
% ssh

Ejemplo con el comando kill. Se definen 2 posibilidades de autocompletar: si se ha escrito un guión se autocompleta con nombres de señales y si no se autocompleta con PIDs.

% complete kill 'c/-/S/' 'p/*/`ps
| awk \{print\ \$1\}`/'
% kill [TAB]
15800 16005 16251 16252 PID

% kill -T[TAB]
TRAP TERM TSTP TTIN TTOU
% kill -T

Autocorrección

Tcsh puede detectar cuando hemos escrito mal un comando y sugerir el comando correcto. Para ctivar esta opción hay que definir la variable correct. Si le damos el valor cmd sólo corregirá el nombre del ejecutable, si ponemos all corregirá también nombres de archivo y de directorio.
% set correct=cmd
% lls
CORRECT>ls (y|n|e|a)? sí
Desktop EDA
% set correct=all
% ls /dv
CORRECT>ls /dev (y|n|e|a)?

Comodines en los nombres de archivo

El más conocido es el '*' que representa cualquier cadena de cualquier extensión.
% ls
1.c 1.h 2.c 2.h 3.c 3.h 4.c 4.h 5.c 6.c 7.c 78.c
% ls *.h
1.h 2.h 3.h 4.h

El símbolo '?' puede representar cualquier carácter, pero sólo uno por cada '?' que escribamos.

% ls ??.c
78.c
% ls ?.h

1.h 2.h 3.h 4.h

'?' se sustituye por cualquier carácter, si queremos que se sustituya por algunos caracteres en concreto hay q usar los corchetes '[]'. Le indicamos los caracteres que queramos entre '[' y ']'.

% ls [89].c
8.c 9.c

Se pueden indicar rangos de caracteres usando el símbolo '-'.

% ls [1-5].c
1.c 2.c 3.c 4.c 5.c
% echo 1.[a-z]
1.c 1.h

Se pueden invertir la sustitución de nombres con '^'. Si escribimos un nombre de ficheros con '^' se sustituiría por todos los ficheros que no cumplen esa condición.

% ls ^??.c
1.c 1.h 2.c 2.h 3.c 3.h 4.c 4.h 5.c 6.c 7.c 8.c
% ls ^*.c
1.h 2.h 3.h 4.h

Con los anteriores comodines podemos crear sustituciones para nombres de ficheros que existieran. Las llaves '{}' pueden usarse para crear sustituciones de ficheros inexistentes. Eso no sirve para nada en comandos como ls o rm, pero puede ser til en otros como touch o mail.

% touch prg.{c,h,txt}
% ls
prg.c prg.h prg.txt
% mail {root,webmaster}@lalala.com
Subject:
......
(envia un mail a root@lalala.com
y webmaster@lalala.com)
No es posible utilizar a la vez '^' y '{}'. Tcsh ignorará el carácter '^' en caso de encontrarlos juntos. Salvo esta excepción el resto de comodines se pueden utilizar juntos e incluso anidarse unos dentro de otros.

Scripting

Tcsh ejecuta scripts con la sintaxis de csh, que es parecida de la C (de ahí su nombre). Algunos textos que hay por ahí (por ejemplo este) recomiendan NO usar Tcsh y csh para ejecutar scripts precisamente por su sintaxis: no son capaces de ejecutar scrips estandar POSIX. Los sistemas que incluyen Tcsh por defecto también incluye un intérprete Sh que es el que debería ser usado para ejecutar scripts. Quien quiera aprender tcsh-scripting que lea la página del man.

Fin

Si quieres probar Tcsh sólo tienes que ejercutar tcsh en tu sistema operativo si lo tienes instalado. Si quieres que sea tu intérprete por defecto tendrá que usar chsh.