исполнительный удар мусорного ведра команды

Я проверял сценарий оболочки и замеченный ниже команды - должностное лицо. исполнительная команда выполняет cmdline, но я задаюсь вопросом, что :-/bin/bash команда делает здесь.

cmdline="$@"
    exec ${cmdline:-/bin/bash}
3
задан 20 October 2017 в 22:24

1 ответ

Как код работает и почему

Существует 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 и т.д.) так как это, там не потребность иметь в наличии дополнительную оболочку ни с чем, чтобы сделать". Но сценарий в этом случае стремится изобретать велосипед и делать, какая оболочка уже преуспевает достаточно - т.е. рабочие команды с аргументами.

2
ответ дан 1 December 2019 в 16:54

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

Похожие вопросы: