Un guión o script es un fichero de texto que contiene una serie de instrucciones que se pueden ejecutar en la línea de órdenes, y que se ejecutarán seguidas. En ese sentido son iguales que los ficheros con extensión BAT de MS-DOS, aunque, por supuesto, como en los sistemas UNIX no existe el concepto de extensión, pueden tener cualquier nombre. El único requisito es que ese fichero de texto tenga permiso de ejecución para la persona que intenta ejecutarlo. Alternativamente, puedes llamar al intérprete y darle como parámetro el nombre del guión, pero es más cómodo dar permiso de ejecución al guión para ahorrarnos escribir el nombre del intérprete.
Esas instrucciones se procesarán por orden, como si alguien las
escribiera en el mismo orden en la línea de órdenes (no es
exactamente así, pero casi). Por ello, van una por línea (los
saltos de línea se interpretan igual que si hubieras pulsado INTRO), o
separadas por caracteres ``punto y coma'' (;
) si están en la
misma línea. Cuando se ejecuta un guión para el
intérprete de órdenes, se intenta ejecutar como un binario
normal, pero al darse cuenta el sistema operativo de que no es un binario
válido, pero que es un archivo de texto, ejecuta un intérprete
hijo y empieza a interpretar el fichero de texto. Si fuera un archivo con un
texto cualquiera, tarde o temprano (probablemente en la primera línea)
habría un error de sintaxis y se abortaría la ejecución
del programa.
Como el resto de los lenguajes de programación (al menos todos los que he visto yo), hay un carácter o unos caracteres especiales que denotan comentario. Ese texto es ignorado por el intérprete al leer el guión, y sólo sirven para que una persona, cuando edite el guión, pueda entender cómo funciona. Este carácter especial es la almohadilla `#', y denota que desde ahí hasta el final de la línea, el resto de los caracteres son un comentario del programador (como el `//' de C++).
Al igual que si fuera un ejecutable cualquiera, un guión
permite redireccionamientos de la entrada y de las salidas. No ocurre lo mismo
con los ficheros BAT de MS-DOS, por razones obvias (el MS-DOS está mal
hecho). Las redirecciones de la entrada, salida estándar, errores
estándar, y todas las salidas se realizan con los caracteres
<
, >
, 2>
y &>
(depende del
intérprete, así son las del bash
), como estoy
suponiendo que ya sabes. Algo que puede que no sepas es que existe un
fichero-dispositivo en UNIX, estándar a todos los clones (en Linux
está), que es el /dev/null
. Cualquier cosa que es escriba en
ese dispositivo virtual va a parar a un agujero negro, es decir, se ignora
completamente. ¿Y para qué sirve esto?, puede que te preguntes.
Pues si quieres comprobar si un programa devuelve un error, pero no quieres
que la salida estándar aparezca en pantalla (porque al usuario no le
interesa, por ejemplo), entonces redireccionas la salida total (con
&>
) a /dev/null
.
#!
Por lo general, en los guiones de los sistemas UNIX se suele incluir
una línea especial, que empieza por #!
(deben ser los dos
primeros caracteres del fichero). La historia de esto es larga, y no la
sé exactamente, pero el caso es que sirve para ejecutar un fichero con
un intérprete determinado (no sólo intérpretes de
órdenes como bash o el intérprete C, sino
también como Perl, Tcl o Python).
Lo único que debes saber es que todos tus guiones deben empezar con una línea como:
#!/bin/bash
En general, debe empezar con los caracteres #!
, seguidos de
la ruta completa al intérprete que desees utilizar para ese
guión. Si no utilizas características específicas de
bash, deberías poner #!/bin/sh
.
¿Y cómo sabes qué intérprete quieres
utilizar? Por lo general, bastará con /bin/sh
. Si utilizas
características específicas del intérprete Korn o del
bash, entonces deberías utilizar /bin/ksh
o
/bin/bash
respectivamente. Si el intérprete fuera del lenguaje
Perl, por ejemplo (nada que ver con este tutorial), querrías que se
ejecutara el programa perl
y que recibiera como parámetro el
fichero en el que has escrito esa línea mágica. Entonces, para
hallar la ruta completa al programa perl
, escribes which
perl
, y el sistema te responderá algo como /usr/bin/perl
o /usr/local/bin/perl
. Tú pones la línea que te
devuelva y listo.