2.9 Agrupación de comandos

La agrupación de comandos se puede usar para:

  • redirigir la salida de varios comandos por pantalla hacia un mismo archivo o hacia una tubería;
  • ejecutar múltiples comandos en el mismo entorno.

Ejemplo

Sólo la salida estándar del segundo comando se redirige al archivo resultado.

Los paréntesis ( ) y las llaves { } nos permiten agrupar los comandos. En el ejemplo de arriba, los comandos se ejecutan en un shell hijo. Las llaves hacen que los comandos se ejecuten en el shell actual.

Paréntesis ( )

Su sintaxis es:

Con los paréntesis, un shell hijo se crea sistemáticamente y es éste el que trata la línea de comandos (con duplicaciones posteriores si es necesario).

Ejemplo 1

En este caso el usuario se sirve de los paréntesis para redirigir la salida estándar de dos comandos:

Veamos el diagrama de (date ; ls) > resultado:

Ejemplo de agrupación con paréntesis – Primera etapa.

El shell actual (PID=201) se duplica. El shell hijo (PID=205) se ocupa primeramente de la redirección (2) y se duplica a continuación para la ejecución del comando externo date (5).

Ejemplo de agrupación con paréntesis – Segunda etapa.

Cuando este ha terminado (7), se duplica de nuevo para ejecutar ls (8).

Ejemplo de agrupación con paréntesis – Tercera etapa.

Mediante el mecanismo de herencia. los dos comandos utilizan el mismo offset (3). Por lo tanto, las escrituras en el archivo se suceden correctamente.

Ejemplo 2

Los comandos pwd y ls tienen como directorio actual /tmp:

Cuando la ejecución de los tres comandos ha terminado, el shell de primer nivel continúa su ejecución. Su directorio actual sigue siendo el del usuario /home/wordpress (en mi caso

Veamos el diagrama de (cd /tmp ; pwd ; ls):

Agrupación con paréntesis – Primera etapa.

El shell de trabajo tiene como directorio actual /home/wordpress (1). Tenemos también la creación de un shell hijo (2). Este último ejecutara el comando interno cd (3) (el directorio actual del shel hijo cambia (4)), después el comando interno pwd (5) (que muestra /tmp) …

Ejemplo de agrupación con paréntesis – Segunda etapa.

… y después se duplica (6) para la ejecución del comando externo ls que hereda del directorio /tmp (7). Cuando todos los comandos se han ejecutado (8), el shell de primer nivel retorna el control. Su directorio actual sigue siendo /home/wordpress.

Las llaves { }

Su sintaxis es:

  • Las llaves de apertura y cierre tienen que estar precedidas y seguidas de un espacio.
  • El último comando tiene que estar seguido de un ;.

Las líneas de comandos se trata por el shell actual (con duplicaciones posteriores si fuera necesario).

Ejemplo 1

Los dos comandos siguientes producen el mismo resultado, pero la versión con llaves es más rápida:

Veamos el diagrama para { date ; ls } > resultado:

Primera etapa – Ejemplo de agrupación con llaves.

El shell de trabajo guarda una copia de sus asociaciones descriptor-archivo actuales (1)

Segunda etapa – Ejemplo de agrupación con llaves.

… tratando él mismo la redirección solicitada (2), se duplica para la ejecución del comando date (5) y cuando éste último ha terminado (7),

Tercera etapa – Ejemplo de agrupación con llaves.

… se duplica de nuevo para ejecutar ls (8). Cuando los comandos han terminado, el shell de primer nivel retorna el control (10) …

Cuarta etapa – Ejemplo de agrupación con llaves.

… y restaura su entorno descriptor-archivo (11).

Ejemplo 2

Veamos otro caso en el que el entorno del shell de primer nivel se va a modificar, lo que no resulta necesariamente útil:

La diferencia entre los paréntesis ( ) y las llaves { }, es que en los paréntesis acabarás siempre en el entorno de trabajo inicial.

Veamos el diagrama de { cd /tmp ; pwd ; ls ; } >listado_archivos:

Primera etapa.- Ejecución de los comandos cd y pwd.

El shell de trabajo guarda una copia de sus asociaciones descriptor-archivo actuales y realiza él mismo la redirección solicitada. A continuación ejecuta el comando interno cd (1) (el directorio actual cambia (2)), después el comando interno pwd (3) (que muestra por lo tanto /tmp)…

… finalmente se duplica (4) para la ejecución del comando externo ls que hereda del directorio /tmp (5). Cuando ls ha terminado, el shell de trabajo retorna el control y restaura su entorno descriptor-archivo. Por contra, su directorio actual sigue siendo /tmp. El comando pwd lo confirma (6).

Conclusión

Los paréntesis se utilizan más que las llaves por estas dos razones:

  • su sintaxis es más sencilla de usar;
  • sea cual sea el conjunto de comandos, se está siempre seguro de reencontrar el entorno de trabajo inicial.

Se utilizan las llaves en los casos de una búsqueda más eficiente.