У меня был случай, когда я случайно начал разворачивать каталог файлов в корне. Он добавил файл .htaccess из моей папки с файлами, который блокирует все php
# If we know how to do it safely, disable the PHP engine entirely.
<IfModule mod_php5.c>
php_flag engine off
</IfModule>
. Нижняя строка проверяет файл .htaccess на root.
В ядре встроена функция встроенной команды exec
, есть семейство из них на основе execve
, которое обычно вызывается из C.
exec
заменяет текущую программу в текущем процессе, без fork
нового процесса. Это не то, что вы будете использовать в каждом скрипте, который вы пишете, но иногда это пригодится. Вот некоторые сценарии, которые я использовал:
.profile
последнее утверждение говорит что-то вроде: exec appln-program
, поэтому теперь нет оболочки для возврата. Даже если appln-program
выходит из строя, конечный пользователь не может попасть в оболочку, потому что его нет - exec
заменил его. csh
, и все просто вставляли в .login
(файл запуска csh) вызов ksh
. В то время как это сработало, он оставил запущенный процесс csh
, и выход был двухступенчатым, что могло запутать. Поэтому мы изменили его на exec ksh
, который только что заменил программу c-shell оболочкой korn, и сделал все проще (есть другие проблемы с этим, например, тот факт, что ksh
не является оболочкой входа). prog1 -> prog2 -> prog3 -> prog4
и т. Д. И никогда не вернемся, сделайте каждый вызов exec. Вы, очевидно, видели, что exec
используется где-то, возможно, если вы показали код, который прослушивает вас, мы могли бы оправдать его использование.
Изменить: я понял, что мой ответ выше неполный. В оболочках, таких как ksh
и bash
, используются два варианта использования exec
- для открытия дескрипторов файлов. Вот несколько примеров:
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 use 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
(например, например, если вы действительно хотели запустить свой собственный spiffy gosh
вместо sh
, но ваш не указан в /etc/shells
, поэтому вы не можете указать его как свою оболочку входа.)
Второе использование exec
для управления файловыми дескрипторами - отдельная тема. В принятом ответе это хорошо сказано; чтобы сохранить это самодостаточным, я просто отнесусь к руководству для чего-либо, где за exec
следует перенаправление вместо имени команды.
bush
. Конечно, это относится к bash
или вообще к любой популярной оболочке Unix; хотя как @anishsane отмечает , Баш тайно оптимизирует bash -c 'command'
, фактически делая exec command
.
– tripleee
26 July 2016 в 05:21
exec gunicorn
дает правильные pid обратно к супервизору. – gru 8 February 2015 в 18:21exec
можно использовать для перенаправления: & gt; Если команда не указана, любые переадресации вступают в силу в текущей оболочке, а статус возврата равен 0. Если есть ошибка перенаправления, статус возврата равен 1. Но как i> действительно работаетexec
изменить файловый дескриптор? Почему эта конкретная команда выбрана для этой задачи? (Markdown не работает прямо сейчас?) – Ray 20 March 2015 в 00:34exec >.\logfilename.log 2>&1
– Hogan 15 April 2015 в 18:26@
вman bash
.exec
заменяет текущую программу новым, опять же, поискомexec
на страницах руководства. – cdarke 7 July 2016 в 07:55