Я проверял сценарий оболочки и замеченный ниже команды - должностное лицо. исполнительная команда выполняет cmdline, но я задаюсь вопросом, что :-/bin/bash
команда делает здесь.
cmdline="$@"
exec ${cmdline:-/bin/bash}
Существует 3 главного, продолжающегося здесь:
$@
специальная переменная оболочки, которая расширяется до всех параметров командной строки к сценарию${cmdline:-/bin/bash}
одна из структур расширения параметра; если cmdline
переменная сброшена или пуста, целое ${}
часть заменяется тем, что прибывает после -
знак, в этом случае /bin/bash
; это - вид сокращения от если оператор или тернарный оператор на других языках программирования (не точно, но достаточно хороший для сравнения)exec
используется для порождения процесса, который настигнет PID текущего процесса, т.е. просто заменит процесс сценария тем, что было в этом ${}
При помещении всего, что вместе код просто берет параметры командной строки и выполняет их, и при отсутствии параметров командной строки к сценарию - Вы становитесь интерактивными bash
оболочка. Обратите внимание, что Вы могли также передать опции exec
это упоминается в документации - выдерживают сравнение ./exec_script.sh -c env
и ./exec_script.sh env
.
Сам подход мог бы казаться замысловатым, но это является частым для наблюдения этого подхода с exec
в сценариях обертки - сценарий настраивает среду и проверяет переменные прежде, чем организовать все для выполнения фактической команды. Различие здесь - то, который в команде сценариев обертки установлен - сценарий обертки обычно настраивает среду и аргументы в пользу выполнения всего одной конкретной программы.
В отличие от этого, этот сценарий стремится работать независимо от того, что пользователь ставит командную строку. И это имеет проблему из-за того, как оболочка работает - данный параметры командной строки, которые содержат специальные символы, команда, которую Вы намереваетесь выполнить, могла бы повредиться. Вот то, что я имею в виду:
# This is how it's supposed to work
$ printf 'one%stwo' $'\t'
one two
# This is how it works with unquoted parameter expansion
$ ./exec_script.sh printf 'one%stwo' $'\t'
onetwo
Вообразите, пытаетесь ли Вы использовать тот сценарий для выполнения my_cool_command filename$'\t'with$'\t'tabs.txt
; в лучшем случае - повреждения команды, но если Вы также имеете filenamewithtab.txt
файл в Вашей текущей папке, my_cool_command
будет воздействовать на абсолютно неправильный файл. И заключение в кавычки расширения параметра не помогает также, потому что затем оно повреждается:
$ ./exec_script.sh printf 'one%stwo' $'\t'
./exec_script.sh: line 4: exec: printf one%stwo : not found
Вот соответствующая часть о расширении параметра от bash
(версия 4.3) руководство:
$ {parameter:-слово}
Используйте Значения по умолчанию. Если параметр сброшен или пустой указатель, расширением слова заменяют. Иначе значением параметра заменяют.
Раздел "Special Parameters":
Расширяется до позиционных параметров, запускающихся от одного. Когда расширение происходит в двойных кавычках, каждый параметр расширяется до отдельного слова. Таким образом, "$" эквивалентен "1$"2$""... Если дважды заключенное в кавычки расширение происходит в слове, к расширению первого параметра присоединяются с начинающейся частью оригинального слова, и к расширению последнего параметра присоединяются с последней частью оригинального слова. Когда нет никаких позиционных параметров, "$" и $ ни до чего не расширяются (т.е. они удалены).
От раздела "Shell Builtin Commands":
должностное лицо [-статья] [-a имя] [команда [аргументы]]
Если команда указана, она заменяет оболочку. Никакой новый процесс не создается. Аргументы становятся аргументами команде. Если-l опция предоставляется, оболочка помещает, тире в начале нулевого аргумента передал команде. Это - то, что входит в систему (1), делает.-c опция заставляет команду выполняться с пустой средой. Если-a предоставляется, название передач оболочки как нулевой аргумент выполняемой команде. Если команда can‐not выполняется по некоторым причинам, неинтерактивная оболочка выходит, если опция оболочки execfail не включена. В этом случае это возвращает отказ. Интерактивная оболочка возвращает отказ, если файл не может быть выполнен. Если команда не указана, любые перенаправления вступают в силу в текущей оболочке, и статус возврата 0. Если существует ошибка перенаправления, статус возврата равняется 1.
Этот сценарий сам имеет хорошую идею в теории, но плохой на практике. exec
команда будет работать хорошо в сценариях обертки, и на самом деле как один из главных пользователей на сайте Unix & Linux, Gilles, упомянутого, "... должностное лицо также сохраняет немного памяти (и другие ресурсы, такие как PIDs и т.д.) так как это, там не потребность иметь в наличии дополнительную оболочку ни с чем, чтобы сделать". Но сценарий в этом случае стремится изобретать велосипед и делать, какая оболочка уже преуспевает достаточно - т.е. рабочие команды с аргументами.