wiki.bash-hackers.org/commands/builtin/exec.md

86 lines
2.4 KiB
Markdown
Raw Permalink Normal View History

2023-04-16 10:04:24 +02:00
# The exec builtin command
## Synopsis
exec [-a NAME] [-cl] [COMMAND] [ARG...] [REDIRECTION...]
## Description
The `exec` builtin command is used to
- **replace** the shell with a given program (executing it, **not as new
process**)
- set redirections for the program to execute or for the current shell
If only redirections are given, the redirections affect the current
shell without executing any program.
### Options
| Option | Description |
|-----------|----------------------------------------------------------------------------------------------------------------------|
| `-a NAME` | Passes `NAME` as zeroth argument for the program to be executed |
| `-c` | Execute the program with an empty (cleared) environment |
| `-l` | Prepends a dash (`-`) to the zeroth argument of the program to be executed, similar to what the `login` program does |
### Exit status
- on redirection errors it returns 1, otherwise 0
- on exec failures:
- a non-interactive shell terminates; if the [shell option
execfail](/internals/shell_options.md#execfail) is set `exec` returns
2023-04-16 10:04:24 +02:00
failure
- in an interactive shell, `exec` returns failure
## Examples
### Wrapper around a program
``` bash
myprog=/bin/ls
2023-04-24 13:27:29 +02:00
echo "This is the wrapper script, it will exec $myprog"
2023-04-16 10:04:24 +02:00
# do some vodoo here, probably change the arguments etc.
# well, stuff a wrapper is there for
2023-04-24 13:27:29 +02:00
exec "$myprog" "$@"
2023-04-16 10:04:24 +02:00
```
### Open a file as input for the script
``` bash
# open it
exec 3< input.txt
# for example: read one line from the file(-descriptor)
read -u 3 LINE
# or
read LINE <&3
# finally, close it
exec 3<&-
```
### Overall script logfile
To redirect the whole `stdout` and `stderr` of the shell or shellscript
to a file, you can use the `exec` builtin command:
``` bash
exec >/var/adm/my.log 2>&1
# script continues here...
```
## Portability considerations
*POSIX(r) specifies error code ranges:
* if ''exec'' can't find the program to execute, the error code shall be 126
* on a redirection error, the error code shall be between 1 and 125
* the ''-a NAME'' option appeared in Bash 4.2-alpha
* POSIX(r) does **not** specify any options for ''exec'' (like ''-c'', ''-l'', ''-a NAME'').
## See also
- [redirection](/syntax/redirection.md)