У меня есть несколько скриптов bash, которые я в основном использую
#!/bin/bash
но я регулярно сталкиваюсь с некоторыми, которые похожи
#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex
и так далее.
Может ли кто-то объяснить значение и преимущества этих вариантов Шебанга и применимы ли они к другим Шебангу?
Ответы:
Если сценарий
/path/to/foo
начинается с#!/bin/bash
, то выполнение/path/to/foo arg1 arg2
эквивалентно выполнению/bin/bash /path/too/foo arg1 arg2
. Если строка shebang есть#!/bin/bash -ex
, это эквивалентно выполнению/bin/bash -ex /path/too/foo arg1 arg2
. Эта функция управляется ядром.Обратите внимание , что вы можете переносимо есть только один аргумент , на притон линии: некоторые Unices (например, Linux) только принимать один аргумент, так что
#!/bin/bash -e -x
приведет к Баш получающей один аргумент пять символов-e -x
(синтаксическая ошибка) , а не два аргумента-e
и-x
.Для оболочки Bourne
sh
и производных оболочек, таких как POSIX sh, bash, ksh и zsh:-e
означает, что в случае сбоя какой-либо команды (на что указывает возвращаемое ненулевое состояние) сценарий немедленно завершается.-x
заставляет оболочку печатать трассировку выполнения.Другие программы могут понимать эти опции, но с разными значениями.
источник
Они параметры , передаваемые
bash
смhelp set
для получения дополнительной информации, в данном случае:источник
-ex
делает обаman bash
):In addition to the single-character shell options documented in the description of the set builtin command, bash interprets the following options when it is invoked: [...]
.Я просто хотел бы упомянуть еще лучшую - как в более портативной - альтернативу:
В приведенном выше примере используется
env
для поискаbash
исполняемого файла, который не всегда в/bin/bash
. Вы олде#!/bin/bash
сценарии не работают на NixOS .Если вы используете ,
env
как показано выше, вы не можете поставить аргумент , такой как-e
вbash
(насколько я знаю). Но вы можете сделать это вместо этого:источник
env
использование не очень хорошо, особенно для сценариев, запускающих python, потому что вы просто не знаете, является ли по умолчаниюpython
версия 2 или 3, и это имеет огромное значение для сценариев, которым нужна определенная версия. Лучше быть явным, чем хитрым