En la forma `exec FD>` de exec

En la forma `exec FD>` de exec

No puedo encontrar nada en la zshpágina de manual que explique exactamente qué hace lo siguiente (por ejemplo)

exec 3> /tmp/foo

Toda la documentación adecuada que puedo encontrar execse refiere al formulario execseguido de un "comando simple". (Por ejemplo, verman zshbuiltins, yman zshmisc.) (El exec FD>formulario se menciona brevemente enman zshmisc, pero en un pasaje que me parece se supone que esta forma ha sido documentada completa y adecuadamente en otro lugar).

Miré todos los éxitos producidos por

man zshall | grep -P '\bexec\b'

...pero ninguno era lo que estaba buscando.

¿Alguien conoce algún buen sustituto de la documentación que falta?


PD: Una posible explicación para lo que me parece "documentación faltante" es que formularios como exec 3> /tmp/fooson en realidad casos especiales del formulario "exec comando simple". Sin embargo, si esto es así, me gustaría encontrar documentación que explique (1) cómo, por ejemplo, 3> /tmp/fooes un comando simple (si ejecuto este "comando simple" en la línea de comando, simplemente se bloquea hasta que presiono ^C) y (2) por qué el código en un script ocurre después de que exec 3> /tmp/foose evalúa algo así, mientras que el que sucede después, por ejemplo, exec dateno.

Respuesta1

Los significados de execcon y sin orden no están relacionados. Supongo que el nombre incorporado está sobrecargado porque un significado no tiene sentido con un comando y el otro no tiene sentido sin un comando, por lo que al hacerlo de esta manera se ahorró tener que inventar un nuevo nombre que luego no se podría utilizar para otro. dominio.

Elmanualestados:

Sidominiose omite pero se especifican las redirecciones, las redirecciones tendrán efecto en el shell actual.

Lo que esto significa es que algo así como exec 3> /tmp/foocambia a qué apunta el descriptor de archivo 3 en el proceso de shell en ejecución. Un fragmento de shell como /bin/somecommand 3>/tmp/foosignifica lo siguiente:

  1. Crea un subproceso.
  2. Abierto /tmp/foopara escritura en el descriptor de archivo 3 en el subproceso.
  3. Ejecute el archivo /bin/somecommanden el subproceso.

exec 3>/tmp/foosolo realiza el paso 3, no hace nada con los procesos.

Después exec 3>/tmp/foo, todos los accesos posteriores al descriptor de archivo 3 desde el shell y sus subprocesos van a /tmp/foo, como con cualquier otra redirección. Por ejemplo, suponga que ejecuta el siguiente script en una terminal sin nada conectado al descriptor de archivo 3:

echo hello           # prints to the terminal
echo nope >&3        # complains about a bad descriptor since no file is open on fd 3
exec >/tmp/out 3>/tmp/three
echo hello           # writes to /tmp/out
echo howdy >&3       # writes to /tmp/three
echo wibble >&3      # writes a second line to /tmp/three

información relacionada