Каковы применения команды exec в сценариях оболочки?

Может кто-нибудь объяснить простыми примерами использования команды exec в сценариях оболочки?

2 ответа

Решение

exec встроенные в ядро ​​функции зеркальных отображений, есть семейство, основанное на execve, который обычно вызывается из C.

exec заменяет текущую программу в текущем процессе, без forkновый процесс. Это не то, что вы бы использовали в каждом сценарии, который вы пишете, но иногда это удобно. Вот несколько сценариев, которые я использовал;

  1. Мы хотим, чтобы пользователь запускал определенную прикладную программу без доступа к оболочке. Мы могли бы изменить программу входа в /etc/passwd, но, возможно, мы хотим, чтобы настройки среды использовались из файлов запуска. Итак, в (скажем) .profileпоследнее утверждение говорит что-то вроде:

     exec appln-program
    

    так что теперь нет оболочки, к которой можно вернуться. Даже если appln-program аварийно завершает работу, конечный пользователь не может попасть в оболочку, потому что ее там нет - exec заменил его.

  2. Мы хотим использовать оболочку, отличную от оболочки в / etc / passwd. Как ни странно, некоторые сайты не позволяют пользователям изменять свою оболочку входа. Один сайт, который я знаю, заставил всех начать cshи все просто положить в свои .login (файл запуска csh) вызов ksh, Хотя это сработало, оно оставило шальные csh процесс запущен, и выход из системы был двухэтапным, что могло запутать. Таким образом, мы изменили его на exec ksh которая просто заменила программу c-shell на оболочку korn и упростила все (есть и другие проблемы, такие как тот факт, что ksh не является логином-оболочкой).

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

Другие вопросы по тегам