exec - macOS


The exec command in macOS is used to replace the current shell process with a new process specified by the user. This command is essential when you want to run a process without creating a new sub-process, thus preserving the original process’s PID. It is especially useful in scripting to alter the behavior of the script’s environment permanently or execute other CLI tools within the same context.


The basic syntax of the exec command is as follows:

exec [command] [arguments]
  • If command is specified, the current shell process will be replaced by the command.
  • If command is omitted, any redirections take effect in the current shell itself.


The exec command does not have specific options besides the redirections and control operators. However, its usage directly affects input/output handling:

  • Redirection: Examples include exec > filename to redirect standard output to a file, or exec 2> filename to redirect standard error.


  1. Replacing the Shell with Another Program:

    exec python3

    After this command, the Python interpreter replaces the current shell. No new process is created, and the Python interpreter uses the same PID as the shell.

  2. Redirecting Output Globally:

    exec > all_output.txt

    This command redirects all outputs of the shell to the file all_output.txt from this point forward.

  3. Combining Programs:

    exec 3>&1 1>log.txt 2>&1
    echo "This will go to the log.txt"
    exec 1>&3

    This complex redirection example sends stdout to log.txt, duplicates stderr to stdout, and then restores stdout back from file descriptor 3.

Common Issues

  • Script termination: When exec is run without redirection in a script, the shell executing the script is replaced entirely by the command. If this is not intended, it can cause the script to terminate unexpectedly after the exec command.

  • File descriptor leakage: Incorrect management of file descriptors with redirections can lead to data going to unexpected places or resource leaks.


exec command can be effectively used in shell scripts for:

  • Altering the file descriptor setup permanently for the duration of the script.
  • Transitioning to a different command interpreter seamlessly.

Example in a script for changing the interpreter:

# This script switches the current Bash shell to Python midway.
exec python3
  • bash: The GNU Bourne-Again SHell, a common command interpreter that often works with exec.
  • sh: The Bourne shell, another command interpreter.
  • ksh: The Korn Shell, also commonly used in environments where exec might be useful.

For further exploration of shell built-in commands and their interactions like exec, refer to the bash man page (man bash) or similar documentation for other shells. The official Apple developer documentation is also a good resource for macOS specific command line tool details.