¿Qué sucede exactamente cuando a una tubería le sigue una agrupación de comandos?

¿Qué sucede exactamente cuando a una tubería le sigue una agrupación de comandos?

Vi una expresión como command1 | {command2;command3;command4}y estaba pensando en lo que esto realmente significa, conozco el símbolo de tubería, sé que {...}obliga a ejecutar los comandos dentro de las llaves en el shell principal, pero no estoy seguro de lo que significan en combinación.

Respuesta1

Realmente no importa cuán complejas sean las partes de una tubería, a menudo puede visualizarlas como scripts separados si lo desea (especialmente en shells como bashlos que ejecutarán cada parte de una tubería en una subcapa de todos modos).

La secuencia de comandos

command2
command3
command4

... cualapenases lo que { command2; command3; command4; }se traduce en (sin tener en cuenta que { ...; }nominalmente significa que los comandos no se ejecutan en un subshell), recibe información de la ejecución de

command1

Dependiendo de lo que estén haciendo esos tres comandos en el primer script, uno o varios de ellos probablemente consumirán la entrada de command1, y si uno o varios de ellos están produciendo algún resultado, irá a la siguiente parte del proceso, o a terminal o hacia donde se redirige la salida del ducto.

Respuesta2

{...}obliga a ejecutar los comandos dentro de las llaves en el shell principal

Esta no es una buena descripción de lo que hacen los frenillos en general. Comandos de grupo de llaves de una manera que no crea un subshell. En otras palabras, las llaves no crean en sí mismas una subcapa: el código entre llaves se ejecuta en la misma shell como si no hubiera llaves, a diferencia del código entre paréntesis que siempre se ejecuta en una subcapa (por lo que sus redirecciones, variables, etc., no afectan al shell principal ni a ningún otro shell).

El objetivo de las llaves es permitir escribir comandos complejos donde la sintaxis espera un solo comando. Por ejemplo, en command1 | { command2; command3; command4; }(tenga en cuenta que los espacios y el punto y coma final son necesarios), el lado derecho de la tubería es { command2; command3; command4; }. El comando { command2; command3; command4; }se ejecuta command2, luego command3, luego command4. Todos estos comandos reciben información de la tubería. (Dado que los comandos se ejecutan sucesivamente, command3obtiene cualquier entrada que quede después de command2la ejecución, y así sucesivamente).

Respuesta3

piense en las llaves como una función sin nombre. p.ej

command234 () { command2; command3; command4; }

command1 | command234 

da el mismo resultado. Cuando las cosas se complican demasiado, prefiero nombrar la agrupación. aunque solo sea para probar.

Respuesta4

La salida estándar de command1se utilizará para el primer comando en el bloque de comandos que comienza a leer desde la entrada estándar. En la mayoría de los casos, esto será command2.

información relacionada