В 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:~:$
Был заменён процесс 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. Она может быть вам очень полезна.