No puedo encontrar nada en la zsh
página de manual que explique exactamente qué hace lo siguiente (por ejemplo)
exec 3> /tmp/foo
Toda la documentación adecuada que puedo encontrar exec
se refiere al formulario exec
seguido 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/foo
son 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/foo
es 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/foo
se evalúa algo así, mientras que el que sucede después, por ejemplo, exec date
no.
Respuesta1
Los significados de exec
con 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/foo
cambia 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/foo
significa lo siguiente:
- Crea un subproceso.
- Abierto
/tmp/foo
para escritura en el descriptor de archivo 3 en el subproceso. - Ejecute el archivo
/bin/somecommand
en el subproceso.
exec 3>/tmp/foo
solo 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