viernes, 10 de julio de 2015

Sustitución de comandos

La sustitución de comandos nos permite usar la salida de un comando como una expansión:

[me@linuxbox ~]$ echo $(ls)
Desktop Documents ls-output.txt Music Pictures Public Templates Videos

Una de mis favoritas hace algo como esto:

[me@linuxbox ~]$ ls -l $(which cp)
-rwxr-xr-x 1 root root 71516 2007-12-05 08:58 /bin/cp

Aquí hemos pasado el resultado de which cp como un argumento para el comando ls, de esta forma obtenemos el listado del programa cp sin tener que saber su ruta completa. No estamos limitados sólo a comandos simples. Se pueden usar tuberías enteras (sólo se muestra una salida parcial):

[me@linuxbox ~]$ file $(ls -d /usr/bin/* | grep zip)

/usr/bin/bunzip2:       symbolic link to `bzip2'

/usr/bin/bzip2:         ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

/usr/bin/bzip2recover:  ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

/usr/bin/funzip:        ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

/usr/bin/gpg-zip:       Bourne shell script text executable

/usr/bin/gunzip:        symbolic link to `../../bin/gunzip'

/usr/bin/gzip:          symbolic link to `../../bin/gzip'

/usr/bin/mzip:          symbolic link to `mtools'

En este ejemplo, el resultado de la tubería se convierte en la lista de argumentos del comando file.

Hay una sintaxis alternativa para la sustitución de comandos en programas de shell antiguos que también es soportada por bash. Utiliza tildes invertidas en lugar del signo del dólar y los paréntesis:

[me@linuxbox ~]$ ls -l `which cp`
-rwxr-xr-x 1 root root 71516 2007-12-05 08:58 /bin/cp

No hay comentarios:

Publicar un comentario