#linux #bash
#linux #bash
Вопрос:
Здесь я не понимаю, чего пытается достичь следующий фрагмент кода, я искал в Интернете информацию об использовании exec, но не совсем понял идею, может кто-нибудь, пожалуйста, помочь объяснить?
Фрагмент кода: exec $(dirname "$0")/init.sh -l interface.mod -l instrument.mod -a postinit.mod -a async.mod "$@"
Спасибо.
Комментарии:
1. exec позволяет выполнить команду, которая полностью заменяет текущий процесс, вместо того, чтобы запускать команду как дочерний процесс.
2. Так в чем же польза от этого? Означает ли это, что после того, как команда стала основным процессом, теперь основной процесс будет принимать какие-либо команды вместо /bin/bash ? Например, echo 1, затем 1 будет передан основному процессу. Это правильное понимание? Спасибо.
3. Если вы хотите заменить свою оболочку bash на zsh, то вы могли
exec /bin/zsh
бы. Итак, у вас есть идея. Если вы хотите сделать то же самое, но позволяете себеexit
изzsh
и вернуться,bash
вы можете заменить внутри подоболочки, например(exec /bin/zsh)
4. Хорошо, я думаю, я понял основную идею.
Ответ №1:
Это exec
встроенная команда оболочки Bash, которая позволяет вам выполнить команду, которая полностью заменяет текущий процесс, т. Е. Текущий процесс оболочки уничтожается и полностью заменяется указанной вами командой. Это полезно, когда вы хотите запустить команду, но не хотите, чтобы оболочка bash была родительским процессом. Когда вы выполняете команду, она полностью заменяет bash — новый процесс не разветвляется, новый PID не создается, а вся память, контролируемая bash, уничтожается и перезаписывается. Это может быть полезно, если, например, вы хотите предоставить пользователю ограниченный доступ к определенной команде. Если команда завершается из-за ошибки, пользователь не будет возвращен в привилегированную оболочку, которая ее выполнила. exec
также может использоваться без какой-либо команды для перенаправления всего вывода текущей оболочки в файл. Вот определение из man bash:
exec [-cl] [-имя] [команда [аргументы]] Если указана command, она заменяет оболочку. Новый процесс не создается. Аргументы становятся аргументами для command. Если указана опция -l, оболочка ставит тире в начале нулевого аргумента, переданного command . Это то, что делает login(1). Опция -c вызывает выполнение команды с пустой средой. Если указан параметр -a, оболочка передает name в качестве нулевого аргумента выполняемой команде. Если команда не может быть выполнена по какой-либо причине, неинтерактивная оболочка завершает работу, если не включена опция exec fail shell. В этом случае он возвращает сбой. Интерактивная оболочка возвращает сбой, если файл не может быть выполнен. Если команда не указана, любые перенаправления вступают в силу в текущей оболочке, а статус возврата равен 0. Если возникает ошибка перенаправления, статус возврата равен 1.
Комментарии:
1.
exec
также часто используется в качестве оптимизации. Если сценарий оболочки собирается запустить какую-либо другую программу в качестве последнего, что он делает , запуск другой программы безexec
средств, оболочка должна сидеть там, ожидая завершения другого процесса, не делая ничего полезного. Использованиеexec
означает, что оболочка переходит непосредственно к другой программе, и нет никакого дополнительного бесполезного процесса, зависающего, занимающего ресурсы. Похоже, что это может быть причиной, по которой оно используется здесь.