Команда exec в Linux

Опубликовано admin - пн, 03/06/2023 - 14:40

В 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:~:$ 

Был заменён процесс Bash.

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

Поделиться с друзьями