After reading explanations of how the exec builtin works in bash, I understand that its basic function is to replace the current process without forking. It also seems to be used for redirecting I/O and closing file descriptors in the current process, which confuses me. Is this some unrelated additional thing exec does? Can it be understood in the context of "replacing the current process"? And how does this work when combined with process substitution, e.g. exec 3< <(my program)?
Add a comment
|
1 Answer
Here's what exec does:
- Set up all redirections in the current process.
- This is a combination of
open,dup2andclosesyscalls for most operations like> foo pipe+fork+/dev/fd/*is used for process substition- Temporary files are created and opened for here-documents and here-strings
- This is a combination of
- Replace the process image (using
execve) with the specified program, if any
If you don't specify a program to run, step 2 is simply skipped, and all redirections therefore affect the rest of the script.
<(Process substitution) works by pipe+fork+/dev/fd/:
- Create a pipe as normal.
- Copy it to FD 63 or somewhere it won't be in the way
- Fork and run a program that reads/writes to the pipe.
- Replace the process substitution with
/dev/fd/63, a special file that will return FD 63 when opened. (tryecho <(ls)).
From then on, it works just like redirecting from any other file. You open /dev/fd/63 for reading on FD 3, and then you end up reading from the pipe. exec therefore doesn't need to do anything special.
1 Comment
cdarke
@Kvass: If you are interested in the way process substitution works under the covers, the source code file is
subst.c and the function is process_substitute, there are quite a few comments. Line 5049 here: code.metager.de/source/xref/gnu/bash/subst.c