Баш Шебанг для чайников?

36

У меня есть несколько скриптов bash, которые я в основном использую

#!/bin/bash

но я регулярно сталкиваюсь с некоторыми, которые похожи

#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex

и так далее.

Может ли кто-то объяснить значение и преимущества этих вариантов Шебанга и применимы ли они к другим Шебангу?

coneybeare
источник
Эти параметры специфичны для Bash (или другого интерпретатора). Они могут быть одинаковыми для других оболочек (например, dash и ksh), но они будут отличаться для других интерпретаторов, таких как AWK и Python. Вы можете использовать многие параметры, которые принимает переводчик. Опции зависят от интерпретатора, а шебанг - это функция ядра.
Приостановлено до дальнейшего уведомления.

Ответы:

41

Если сценарий /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 заставляет оболочку печатать трассировку выполнения.

Другие программы могут понимать эти опции, но с разными значениями.

Жиль "ТАК - перестань быть злым"
источник
24

Они параметры , передаваемые bashсм help setдля получения дополнительной информации, в данном случае:

-x  Print commands and their arguments as they are executed.
-e  Exit immediately if a command exits with a non-zero status.
Кир
источник
3
+1 И -exделает оба
Nifle
Это сбивает с толку, потому что они похожи на параметры командной строки, переданные в Bash.
Caoilte
2
@Caoilte: И в самом деле они являются (с 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: [...].
cyrus
1
Arrgh! мигаете и скучаете! :).
Caoilte
0

Я просто хотел бы упомянуть еще лучшую - как в более портативной - альтернативу:

#!/usr/bin/env bash

В приведенном выше примере используется envдля поиска bashисполняемого файла, который не всегда в /bin/bash. Вы олде#!/bin/bash сценарии не работают на NixOS .

Если вы используете , envкак показано выше, вы не можете поставить аргумент , такой как -eв bash(насколько я знаю). Но вы можете сделать это вместо этого:

#!/usr/bin/env bash
set -e
Саймон Аллинг
источник
2
Я делаю это все время, но я бы не сказал, что это «более портативно» - на самом деле, риск того, что пользователь запустит что-то совершенно другое (по сравнению с тем, с чем вы можете предположить, что система поставляется в комплекте) намного выше. Например, Ubuntu по-прежнему поставляет Bash 4, а пользователь может выбрать запуск Bash 5.
slhck
Да, envиспользование не очень хорошо, особенно для сценариев, запускающих python, потому что вы просто не знаете, является ли по умолчанию pythonверсия 2 или 3, и это имеет огромное значение для сценариев, которым нужна определенная версия. Лучше быть явным, чем хитрым
smac89