lunes, 23 de enero de 2017

Documentos-aquí

Hemos visto dos métodos distintos de mostrar nuestro texto, ambos usando el comando echo. Hay una tercera forma llamada here document or here script (documento-aquí o script-aquí). Un documento-aquí es una forma adicional de redirección I/O en la que incluimos un cuerpo de texto en nuestro script y lo introducimos en la entrada estándar de un comando. Funciona así:

comando << token

texto

token

donde comando es el nombre de un comando que acepta la entrada estándar y token es una cadena usada para indicar el final del texto incluido. Modificaremos nuestro script para usar un documento-aquí:

#!/bin/bash

# Program to output a system information page

TITLE="System Information Report For $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIMESTAMP="Generated $CURRENT_TIME, by $USER"

cat << _EOF_
<HTML>
        <HEAD>
                <TITLE>$TITLE</TITLE>
        </HEAD>
        <BODY>
                <H1>$TITLE</H1>
                <P>$TIMESTAMP</P>
        </BODY>
</HTML>
_EOF_

En lugar de usar echo, nuestro script ahora usa cat y un documento-aquí. La cadena _EOF_ (que significa "End Of File" o "Fin del archivo", una convención común) ha sido seleccionada como token, y marca el final del texto incluido. Fíjate que el token debe aparecer sólo y no debe haber espacios al final de la línea.

Entonces ¿cual es la ventaja de usar un documento-aquí? Es principalmente lo mismo que echo, excepto que, por defecto, las comillas sencillas y dobles dentro de los documentos-aquí pierden su significado especial para el shell. Aquí hay un ejemplo en la línea de comandos:

[me@linuxbox ~]$ foo="some text"
[me@linuxbox ~]$ cat << _EOF_
> $foo
> "$foo"
> '$foo'
> \$foo
> _EOF_
some text
"some text"
'some text'
$foo

Como podemos ver, el shell no presta atención a las comillas. Las trata como caracteres ordinarios. Esto nos permite incluir comillas libremente dentro de un documento-aquí. Podría ser útil para nuestro programa de informes.

Los documentos-aquí pueden usarse con cualquier comando que acepte entrada estándar. En este ejemplo, usamos un documento-aquí para pasar una serie de comandos al programa ftp para descargar un archivo de un servidor FTP remoto:

#!/bin/bash

# Script to retrieve a file via FTP

FTP_SERVER=ftp.nl.debian.org
FTP_PATH=/debian/dists/lenny/main/installer-i386/current/images/cdrom
REMOTE_FILE=debian-cd_info.tar.gz

ftp -n << _EOF_
open $FTP_SERVER
user anonymous me@linuxbox
cd $FTP_PATH
hash
get $REMOTE_FILE
bye
_EOF_
ls -l $REMOTE_FILE

Si cambiamos el operador de redirección de "<<" a "<<-" el shell ignorará los caracteres tabulador iniciales en el documento-aquí. Esto permite sangrar un documento-aquí, lo que puede mejorar su legibilidad:

#!/bin/bash

# Script to retrieve a file via FTP

FTP_SERVER=ftp.nl.debian.org
FTP_PATH=/debian/dists/lenny/main/installer-i386/current/images/cdrom
REMOTE_FILE=debian-cd_info.tar.gz

ftp -n <<- _EOF_
    open $FTP_SERVER
    user anonymous me@linuxbox
    cd $FTP_PATH
    hash
    get $REMOTE_FILE
    bye
    _EOF_

ls -l $REMOTE_FILE

No hay comentarios:

Publicar un comentario