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