Использовать расширение .sh или .bash для скриптов bash?

36

(См. Использование #! / Bin / sh или #! / Bin / bash для совместимости с Ubuntu-OSX и простоты использования и POSIX )

Если я хочу, чтобы в моих сценариях использовалась оболочка bash, действительно ли расширение .bash вызывает bash или это зависит от конфигурации системы / 1-й строки shebang. Если бы оба действовали, но отличались друг от друга, какой бы приоритет?

Я не уверен, заканчивать ли мои сценарии с помощью .sh, чтобы просто указать «сценарий оболочки», а затем в первой строке выбрать оболочку bash (например #!/usr/bin/env bash), или же просто завершить их с помощью .bash (а также настройки строки 1) ). Я хочу, чтобы Bash был вызван.

Майкл Даррант
источник
3
Я не думаю, что когда-либо видел .bashрасширение. Кроме того, политика Debian заключается в том, чтобы в пакетах присутствовали сценарии, которые попадают в одну из binпапок и не имеют расширений.
Муру

Ответы:

19

Использует ли расширение .bash на самом деле вызвать Bash или это зависит от конфигурации системы / 1-й линии Шебанга.

Если вы не используете интерпретатор явно, то вызываемый интерпретатор определяется shebangиспользуемым в сценарии. Если вы используете переводчика специально, то переводчику все равно, какое расширение вы дадите для своего сценария. Тем не менее, расширение существует для того, чтобы другим было совершенно очевидно, что это за сценарий.

[sreeraj@server ~]$ cat ./ext.py
#!/bin/bash
echo "Hi. I am a bash script"

Видите, .pyрасширение скрипта bash не делает его скриптом python.

[sreeraj@server ~]$ python ./ext.py
  File "./ext.py", line 2
    echo "Hi. I am a bash script"
                                ^
SyntaxError: invalid syntax

Это всегда bashсценарий.

[sreeraj@server ~]$ ./ext.py
Hi. I am a bash script
Sree
источник
23

Наименование скрипта не имеет ничего общего с тем, как он выполняется.

Строка shebang определяет, какой интерпретатор используется для запуска скрипта.

Мне лично все равно, является ли скрипт sh, bash, perl, каким бы то ни было, поэтому я просто называю его для того, что он делает; Я считаю добавление расширения излишним. Я сделаю, file scriptnameчтобы узнать, что это за файл, если я хочу это знать.

Поэтому, если вы хотите, чтобы ваш скрипт запускался bash, используйте #!/bin/bashв качестве первой строки.

wurtel
источник
4
Кроме того, если выбор реализации для скрипта когда-либо изменится (скажем, он переписан на Python, Perl, C ...), отсутствие .shрасширения -style означает, что нет необходимости переименовывать его. (По общему признанию, ничто не мешает программе на Си, производящей бинарный файл с .shрасширением, это просто сбивает с толку.)
Стивен Китт
2
Использование #!/usr/bin/env bashдля переносимости, обсуждаемое здесь stackoverflow.com/a/10383546/54964
Лео Леопольд Херц 준영
4
@wurtel (запоздалый комментарий, хорошо?) Добавление расширения imho далеко не излишне. Большинство редакторов поддерживают подсветку синтаксиса, основанную на расширении, плюс имеет смысл немедленно увидеть тип файла. Ясность и читаемость имеют большое значение.
RolfBly
@RolfBly: редакторы, которые я использую, распознают шебанг и обеспечивают подсветку синтаксиса. Ясность полезна, но большую часть времени мы хотим выполнить команду, и будет хорошо, если мне придется печатать меньше и если я не буду помнить язык ее реализации.
Хонтвари Левенте