Каковы применения команды exec в сценариях оболочки?
Может кто-нибудь объяснить простыми примерами использования команды exec в сценариях оболочки?
2 ответа
exec
встроенные в ядро функции зеркальных отображений, есть семейство, основанное на execve
, который обычно вызывается из C.
exec
заменяет текущую программу в текущем процессе, без fork
новый процесс. Это не то, что вы бы использовали в каждом сценарии, который вы пишете, но иногда это удобно. Вот несколько сценариев, которые я использовал;
Мы хотим, чтобы пользователь запускал определенную прикладную программу без доступа к оболочке. Мы могли бы изменить программу входа в /etc/passwd, но, возможно, мы хотим, чтобы настройки среды использовались из файлов запуска. Итак, в (скажем)
.profile
последнее утверждение говорит что-то вроде:exec appln-program
так что теперь нет оболочки, к которой можно вернуться. Даже если
appln-program
аварийно завершает работу, конечный пользователь не может попасть в оболочку, потому что ее там нет -exec
заменил его.Мы хотим использовать оболочку, отличную от оболочки в / etc / passwd. Как ни странно, некоторые сайты не позволяют пользователям изменять свою оболочку входа. Один сайт, который я знаю, заставил всех начать
csh
и все просто положить в свои.login
(файл запуска csh) вызовksh
, Хотя это сработало, оно оставило шальныеcsh
процесс запущен, и выход из системы был двухэтапным, что могло запутать. Таким образом, мы изменили его наexec ksh
которая просто заменила программу c-shell на оболочку korn и упростила все (есть и другие проблемы, такие как тот факт, чтоksh
не является логином-оболочкой).Просто чтобы сохранить процессы. Если мы позвоним
prog1 -> prog2 -> prog3 -> prog4
и т.д. и никогда не возвращаться, а затем сделать каждый вызов exec Это экономит ресурсы (правда, не так много, если не повторяется) и упрощает отключение.
Вы, очевидно, видели exec
где-то использовался, возможно, если бы вы показали код, который вас глючит, мы могли бы оправдать его использование.
Изменить: я понял, что мой ответ выше, является неполным. Есть два варианта использования exec
в ракушках ksh
а также bash
- используется для открытия файловых дескрипторов. Вот некоторые примеры:
exec 3< thisfile # open "thisfile" for reading on file descriptor 3
exec 4> thatfile # open "thatfile" for writing on file descriptor 4
exec 8<> tother # open "tother" for reading and writing on fd 8
exec 6>> other # open "other" for appending on file descriptor 6
exec 5<&0 # copy read file descriptor 0 onto file descriptor 5
exec 7>&4 # copy write file descriptor 4 onto 7
exec 3<&- # close the read file descriptor 3
exec 6>&- # close the write file descriptor 6
Обратите внимание, что расстояние очень важно здесь. Если вы поместите пробел между номером fd и символом перенаправления, то exec
возвращается к первоначальному значению:
exec 3 < thisfile # oops, overwrite the current program with command "3"
Есть несколько способов их использования, при использовании ksh read -u
или же print -u
на bash
, например:
read <&3
echo stuff >&4
Просто для дополнения принятого ответа коротким коротким ответом для новичков вам, вероятно, не нужно exec
,
Если вы все еще здесь, следует надеяться, что последующее обсуждение покажет, почему. Когда вы бежите, скажем,
sh -c 'command'
ты управляешь sh
экземпляр, затем начать command
как ребенок этого sh
пример. когда command
заканчивается, sh
Экземпляр также заканчивается.
sh -c 'exec command'
управляет sh
экземпляр, а затем заменяет sh
экземпляр с command
двоичный, и запускает это вместо.
Конечно, оба они бесполезны в этом ограниченном контексте; ты просто хочешь
command
Есть некоторые крайние ситуации, когда вы хотите, чтобы оболочка прочитала свой файл конфигурации, или каким-то иным образом настроили среду как подготовку к запуску. command
, Это в значительной степени единственная ситуация, когда exec command
Полезно.
#!/bin/sh
ENVIRONMENT=$(some complex task)
exec command
Это делает некоторые вещи для подготовки среды, чтобы она содержала то, что нужно. Как только это будет сделано, sh
экземпляр больше не нужен, и поэтому (небольшая) оптимизация просто заменяет sh
экземпляр с command
процесс, а не иметь sh
запустите его как дочерний процесс и дождитесь его, затем выйдите, как только он закончится.
Точно так же, если вы хотите высвободить как можно больше ресурсов для тяжелой команды в конце сценария оболочки, вы можете захотеть exec
эта команда в качестве оптимизации.
Если что-то заставляет вас бежать sh
но вы действительно хотели запустить что-то еще, exec something else
это, конечно, обходной путь для замены нежелательного sh
экземпляр (как, например, если вы действительно хотите запустить свой собственный элегантный gosh
вместо sh
но ваш не указан в /etc/shells
поэтому вы не можете указать его в качестве оболочки входа в систему).
Второе использование exec
манипулировать файловыми дескрипторами - отдельная тема. Принятый ответ охватывает это приятно; чтобы сохранить эту автономность, я просто обращусь к руководству для всего, что exec
сопровождается перенаправлением вместо имени команды.