Linux exec how to

Using exec Command in Bash Shell Scripts

The exec command in shell scripts is super useful for logging, reading from files and running commands by replacing the current process.

The shell built-in exec command is used for executing commands in shell scripts.

Wait! Don’t shell scripts execute Linux commands already? They do. But exec runs the Linux commands without starting a new process. It replaces the shell process with the specified command.

Seems complex? Let me give you some examples of using the exec command in shell scripts:

  • Process replacement
  • Logging within the shell script
  • Change standard input to read a file
  • Change file descriptors

So let’s start with the first one.

1. Use the exec command to replace process in shell script

Replacing the process is one of the most known implementations of exec in the shell script.

So here, I will be using a simple script that will display how the exec command in the script can be used to replace the current shell process.

First, use the following command to use the nano to create and edit a new script:

nano process_replacement.sh
#!/bin/bash echo "Before exec: This is the original script" exec ls -l echo "After exec: This line will not be executed"

Now, let me explain what this script will do.

Here are three command statements. First will print the basic text indicating the original script which is meant to be replaced.

The second statement involves the usage of the exec command with the ls command to list the contents of the current working directory and it will replace the previous process too!

Now, the third statement won’t be executed as the process was replaced by the exec previously, and there were no additional arguments to support the execution of the third command statement.

Simply put, the process will be replaced by the 2nd command argument, and the 3rd command won’t be executed.

And here’s the output if you execute the shown script:

use the exec command in the shell script to replace the process

And as you can see, the 3rd command statement which was supposed to print «After exec: This line will not be executed» is shown here.

Читайте также:  Linux return exit code

That does not seem very practical? Here’s another example.

2. Use exec command in shell scripts for logging

Yet another interesting and easy implementation of the exec is where you can redirect the output to a file.

Here, I will be using 3 arguments, two for the standard output and one for standard error.

#!/bin/bash LOG_FILE="script.log" # Redirect stdout and stderr to the log file exec &> "$LOG_FILE" # Start logging echo "Script started at $(date)" # Perform some operations echo "Performing operation 1 (stdout). " ls -l /path/to/directory echo "Performing operation 2 (stderr). " grep "search term" /path/to/nonexistentfile echo "Performing operation 3 (stdout). " cat /path/to/file # Log completion echo "Script completed at $(date)"

I have created an empty file named script.log in the same directory where the above script is located to store the logs.

Here, the exec command will redirect the output to the log file including when is started and ended.

When I ran the script, the file containing the log file looked like this:

use exec command in shell script to store logs

3. Change standard input to read files using exec

This can be very helpful when performing certain operations over the file.

Here, I will be using a simple text file named Hello.txt that contains some random text lines:

Ubuntu, openSUSE, Arch, Debian, Fedora + - / * 2 4 6 1 4 6 1 2

And here’s the script which will read from the file and output the contents to the standard output:

#!/bin/bash INPUT_FILE="Hello.txt" # Redirect stdin to read from a file exec < "$INPUT_FILE" # Read the entire file as a single input content=$(cat) # Process the input echo "Read: $content"

Now, let me explain the script.

And if you execute the script, the result will look like this:

use exec command in shell script to change the standard input to read the file

4. Change file descriptors using exec in the shell script (advanced)

There are three standard file descriptors in Linux:

  1. Standard input (stdin - file descriptor 0)
  2. Standard output (stdout - file descriptor 1)
  3. Standard error (stderr - file descriptor 2)

And using the exec command, you can change the descriptors. For example, you can use any number to use the preferred data stream, such as using 3 for stdin.

Let me share the script first and then explain how it functions:

#!/bin/bash # Open a file for writing exec 3> output.txt # Redirect stdout to file descriptor 3 exec 1>&3 # Print some output echo "This is a test message" # Close the file descriptor exec 3>&-

Here, I have opened a output.txt file and assigned file descriptor 3 which means anything sent to file descriptor 3 will be written to the file.

Using exec 1>&3 , I have redirected the standard output (1) to the file descriptor 3 which means anything written to the standard output will be sent to the file descriptor 3 (to the output.txt in my case).

The echo statement prints the text to the standard output (which will be sent to the file as we changed the file descriptor earlier).

Читайте также:  Is osx linux or unix

And exec 3>&- kills the file descriptor 3 as it is no longer needed!

You can expect the following results after executing the above script:

Change file descriptors using exec in the shell script

Do more by pairing exec with the find command

Did you know that you can use the find command with the exec and trust me, it makes a killer combination?

And if you want to learn how to, here's a detailed guide:

I hope you will find this guide helpful. And if you have doubts, leave a comment.

Источник

Linux exec how to

NAME

exec - execute commands and open, close, or copy file descriptors

SYNOPSIS

exec [command [argument . ]] 

DESCRIPTION

The exec utility shall open, close, and/or copy file descriptors as specified by any redirections as part of the command. If exec is specified without command or arguments, and any file descriptors with numbers greater than 2 are opened with associated redirection statements, it is unspecified whether those file descriptors remain open when the shell invokes another utility. Scripts concerned that child shells could misuse open file descriptors can always close them explicitly, as shown in one of the following examples. If exec is specified with command, it shall replace the shell with command without creating a new process. If arguments are specified, they shall be arguments to command. Redirection affects the current shell execution environment.

OPTIONS

OPERANDS

STDIN

INPUT FILES

ENVIRONMENT VARIABLES

ASYNCHRONOUS EVENTS

STDOUT

STDERR

The standard error shall be used only for diagnostic messages.

OUTPUT FILES

EXTENDED DESCRIPTION

EXIT STATUS

If command is specified, exec shall not return to the shell; rather, the exit status of the process shall be the exit status of the program implementing command, which overlaid the shell. If command is not found, the exit status shall be 127. If command is found, but it is not an executable utility, the exit status shall be 126. If a redirection error occurs (see Consequences of Shell Errors ), the shell shall exit with a value in the range 1-125. Otherwise, exec shall return a zero exit status.

CONSEQUENCES OF ERRORS

Default. The following sections are informative. 

APPLICATION USAGE

EXAMPLES

Open readfile as file descriptor 3 for reading: exec 3 readfile Open writefile as file descriptor 4 for writing: exec 4> writefile Make file descriptor 5 a copy of file descriptor 0: exec 5 Close file descriptor 3: exec 3 Cat the file maggie by replacing the current shell with the cat utility: exec cat maggie 

RATIONALE

Most historical implementations were not conformant in that: foo=bar exec cmd did not pass foo to cmd.

FUTURE DIRECTIONS

SEE ALSO

Special Built-In Utilities 

© 2019 Canonical Ltd. Ubuntu and Canonical are registered trademarks of Canonical Ltd.

Источник

Команда exec в Linux

В Linux команда exec , выполняющая команды из самого Bash, является мощным инструментом замены процессов, гибкого протоколирования сценариев.

Примеры использования команды exec в Linux

Если команда 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 . Она может быть вам очень полезна.

Источник

Оцените статью
Adblock
detector