- exec command in Linux with examples
- Linux exec Command With Examples
- Linux exec Command Syntax
- Linux exec Command Options
- Linux exec Command Examples
- Basic Use (Process Replacement)
- Replace Current Shell Session
- Program Calls With exec in Bash Scripts
- Logging Bash Scripts
- Run Scripts in a Clean Environment
- exec With find Command
- Команда exec в Linux
- Синтаксис
- Опции
- Использование команды exec в Linux
- Базовое использование (замена процесса)
- Утилита с дополнительной командой в качестве аргумента
- Замена текущего сеанса оболочки
- Запуск скриптов в чистой среде
- Выполнение утилиты с командой поиска
- Заключение
exec command in Linux with examples
exec command in Linux is used to execute a command from the bash itself. This command does not create a new process it just replaces the bash with the command to be executed. If the exec command is successful, it does not return to the calling process.
exec [-cl] [-a name] [command [arguments]] [redirection . ]
- c: It is used to execute the command with empty environment.
- a name: Used to pass a name as the zeroth argument of the command.
- l: Used to pass dash as the zeroth argument of the command.
Note: exec command does not create a new process. When we run the exec command from the terminal, the ongoing terminal process is replaced by the command that is provided as the argument for the exec command.
The exec command can be used in two modes:
- Exec with a command as an argument: In the first mode, the exec tries to execute it as a command passing the remaining arguments, if any, to that command and managing the redirections, if any. Example 1:Example 2:The exec command searches the path mentioned in the $PATH variable to find a command to be executed. If the command is not found the exec command as well as the shell exits in an error.
- Exec without a command: If no command is supplied, the redirections can be used to modify the current shell environment. This is useful as it allows us to change the file descriptors of the shell as per our desire. The process continues even after the exec command unlike the previous case but now the standard input, output, and error are modified according to the redirections. Example:Here the exec command changes the standard out of the shell to the tmp file and so all the commands executed after the exec command write their results in that file. This is one of the most common ways of using exec without any commands.
Linux exec Command With Examples
The Linux exec command executes a Shell command without creating a new process. Instead, it replaces the currently open Shell operation. Depending on the command usage, exec has different behaviors and use cases.
This article demonstrates how to use the exec command in Linux.
- Access to the command line/terminal as sudo.
- Basic understanding of Linux terminal commands (use our Linux commands cheat sheet).
- A Linux text editor such as nano.
Linux exec Command Syntax
The exec command syntax is:
exec [options] [command [arguments]] [redirection]
The command behaves differently depending on the number of arguments:
- If an argument is present, the exec command replaces the current shell with the executed program. In a Bash script, any commands after do not get executed.
- If no command argument is present, all redirections occur in the current shell.
The exec command never returns to the original process unless there’s an error or the command runs in a subshell.
Linux exec Command Options
Below is a brief explanation of all exec options:
Option | Description |
---|---|
-c | Executes the command in an empty environment. |
-l | Passes a dash ( — ) as the zeroth argument. |
-a [name] | Passes a [name] as the zeroth argument. |
Continue reading to see how exec works through examples.
Linux exec Command Examples
The examples below demonstrate the behavior of the exec command in the terminal and through Bash scripts.
Basic Use (Process Replacement)
To see how exec works, do the following:
The output shows the currently running Bash shell and the ps command. The Bash shell has a unique PID.
2. To confirm, check the current process ID with:
The PID is the same as the output from the ps command, indicating this is the currently running Bash process.
3. Now, run exec and pass the sleep command for one hundred seconds:
The sleep command waits for 100 seconds.
4. In another terminal tab, list all currently running processes and grep the sleep command:
The PID for the process is the same as the Bash shell PID, indicating the exec command replaced the Bash shell process.
The Bash session (terminal tab) closes when the one hundred seconds are complete and the process ends.
Replace Current Shell Session
Use the exec command to replace the current shell session:
1. Check the current shell PID:
2. Use exec to switch to the Bourne Shell:
3. In another tab, check the PID for the Bourne Shell process:
Note: The \b in grep is Regex for matching word boundary, allowing an exact match of sh in the output. Learn more in our Grep Regex tutorial.
The command replaces the Bash process. Exiting the Bourne Shell exits the terminal session completely.
Program Calls With exec in Bash Scripts
To see how exec works in Bash scripts, do the following:
1. Open a text editor, such as Nano, and create a script file:
2. Paste the following code:
#!/bin/bash while true do echo "1. Update " echo "2. Upgrade " echo "3. Exit" read Input case "$Input" in 1) exec sudo apt update ;; 2) exec sudo apt upgrade ;; 3) break esac done
The script does the following:
- Line 3 creates an infinite while loop.
- Lines 5-7 print the three possible options.
- Line 8 reads the user’s input into the variable $Input .
- Line 9 starts a case statement checking the user’s input.
- Lines 10-11 execute the apt update or apt upgrade command in place of the current shell. When the update or upgrade process ends, the terminal session exits.
- Line 12 uses the break statement to exit the infinite while loop and ends the script. The session returns to the current shell as usual.
3. Save the script and close Nano.
4. Run the Bash script in the current environment to see the results:
Executing the script with the source command applies the script behavior to the current Bash shell. Use exec to run Bash scripts within other programs for a clean exit.
Logging Bash Scripts
The exec command finds use in manipulating file descriptors for error logging in Bash scripts. The default Linux file descriptors are:
Use the exec command and redirect the file descriptors to a file to create logs. To see how logging works, follow the steps below:
1. Create a sample Bash script:
2. Paste the code into the file:
#!/bin/bash # Create test.log file touch test.log # Save test.log to log_file variable log_file="test.log" # Redirect stdin to $log_file exec 1>>$log_file # Redirect stderr to the same place as stdin exec 2>&1 echo "This line is added to the log file" echo "And any other lines after" eho "This line has an error and is logged as stderr"
The script redirects all command outputs and errors to the same file (test.log).
3. Save the script and close the text editor.
The script does not output any code. Instead, all the output logs to the test.log file.
6. Use the cat command to see the test.log file contents:
The log file contains all the standard outputs and error messages. Use exec to debug scripts and log inputs, outputs, or errors depending on the situation.
Run Scripts in a Clean Environment
The -c option for the exec command creates a clean environment. To demonstrate, do the following in the terminal:
1. Start a new Bash shell session:
2. Use the printenv command to print all the environment variables in the current Bash shell:
The command prints all the environment variables for the current Bash shell session.
3. Run the same command using exec with the -c flag:
The command printenv runs in a clean environment, and no variables output to the console. Use the -c option to run scripts or commands in clean environments.
exec With find Command
The find command in Linux has the exec command as an option to execute an action on discovered content. For example, the line below executes the chmod command on the find command results:
sudo find ~ -name "test.log" -exec chmod +x '<>' \;
The find command searches through the home directory (~) for the test.log file and executes the permission change.
After following the examples from this tutorial, you should know how to use the exec command effectively in Bash scripts.
Команда exec в Linux
В Linux команда exec , выполняющая команды из самого Bash, является мощным инструментом замены процессов, гибкого протоколирования сценариев.
Если команда exec выполнена успешно, она не возвращается к вызывающему процессу.
Синтаксис
exec [опции] [команда [аргументы]] [перенаправление]
Опции
-c Выполнение команды в чистой среде -l Передача тире — в качестве нулевого аргумента -a [имя] Передача имя в качестве нулевого аргумента
Команда exec не создает новый процесс. Когда мы запускаем утилиту из терминала, текущий терминальный процесс заменяется командой, которая предоставляется в качестве аргумента.
Использование команды exec в Linux
Базовое использование (замена процесса)
Для замены процесса открывается терминал и перечисляются запущенные процессы:
oleg@mobile:~:$ ps PID TTY TIME CMD 187005 pts/0 00:00:00 bash 190994 pts/0 00:00:00 ps oleg@mobile:~:$
Вывод показывает текущую запущенную оболочку Bash и команду ps . Оболочка Bash имеет уникальный PID.
Для подтверждения можно проверить идентификатор текущего процесса:
oleg@mobile:~:$ echo $$ 187005 oleg@mobile:~:$
PID совпадает с выводом команды ps , указывая на то, что это текущий процесс Bash.
Утилита с дополнительной командой в качестве аргумента
В этом режиме exec пытается выполнить аргумент как команду, передавая оставшиеся аргументы, если они есть, этой команде и управляя перенаправлениями, если таковые имеются.
oleg@mobile:~:$ bash non-network local connections being added to access control list oleg@mobile:~:$ exec ls abc.txt backgrounds Desktop Documents store www Документы Музыка Apps bin Directory Downloads tmp Yandex.Disk Загрузки Общедоступные aur ChestitaBabaMarta.jpg docs mailbox webprojects Видео Изображения Шаблоны oleg@mobile:~:$
Утилита exec ищет путь, указанный в переменной $PATH с необходимой исполняемой командой. Если команда не найдена, утилита, а также оболочка завершают работу с ошибкой.
Замена текущего сеанса оболочки
Проверяем текущий PID оболочки:
oleg@mobile:~:$ echo $$ 179575 oleg@mobile:~:$
Используем утилиту для переключения в оболочку Bourne:
oleg@mobile:~:$ exec sh oleg@mobile:~:$
На другой вкладке проверяем PID процесса Bourne Shell:
oleg@mobile:~:$ ops -ae | grep "\bsh\b"| grep "\bsh\b" 179575 pts/0 00:00:00 sh oleg@mobile:~:$
Выход из Bourne Shell завершит сеанс терминала.
Запуск скриптов в чистой среде
Для сброса всех переменных окружения и чистого запуска используется опция -c :
oleg@mobile:~:$ exec -c printenv
В связи с тем, что команда printenv перечисляет переменные окружения, то при передаче её в качестве аргумента вывод будет пустым.
Выполнение утилиты с командой поиска
Утилиту exec можно использовать для выполнения операций: grep , cat , mv , cp , rm и других над файлами, найденными командой find .
Для примера найдём все файлы * , содержащие слово iwd в каталоге ~/webprojects/linuxcookbook.ru/artiles :
oleg@mobile:~:$ find ~/webprojects/linuxcookbook.ru/articles -name "*" -type f -exec grep -l iwd <> \; /home/oleg/webprojects/linuxcookbook.ru/articles/utilita-iwctl-arch-linux /home/oleg/webprojects/linuxcookbook.ru/articles/RCS/utilita-iwctl-arch-linux,v oleg@mobile:~:$
Здесь для поиска обычных текстовых файлов была указана опция -type f . Затем мы использовали опцию -exec для выполнения команды grep в списке файлов, возвращённых командой find .
Точка с запятой в конце ; заставляет команду grep исполняться для каждого файла по очереди, поскольку <> заменяется именем текущего файла. Обратите внимание, что обратный слэш необходим для того, чтобы точка с запятой не интерпретировалась оболочкой.
Заключение
В этой статье были рассмотрены основные варианты использования встроенной в Bash команды exec . Она может быть вам очень полезна.