У меня есть куча свернутых вручную исполняемых скриптов в моем каталоге $ HOME / bin. Некоторые написаны на bash, некоторые на Ruby. У всех них есть строка shebang вверху, указывающая оболочке, какой интерпретатор использовать (в моем случае bash или Ruby).
Мне интересно, лучше ли добавлять в эти сценарии расширения файлов, чтобы указать, на каком языке сценариев они написаны? Например, скрипты в Ruby будут иметь суффикс * .rb, а bash - суффикс * .sh.
В настоящее время эти сценарии имеют простые имена без расширения файла.
Какая лучшая практика?
Ответы:
Вы можете выполнять подстановочные команды, например
ls *.rb
или,cp *.sh
если вы хотите организовать свои сценарии в будущем.Начни рано или пожалеешь позже, на мой взгляд.
Такие редакторы, как
vim
также, смогут применять правильную подсветку синтаксиса на основе shebang или расширения файла.Это также может быть достигнуто с помощью моделей в различных редакторах. Например, для VIM:
источник
Ну, как и большинство вещей в жизни: это зависит от ваших потребностей.
Вы заявили, что эти сценарии находятся в каталоге bin, и я предполагаю, что эти сценарии должны вызываться из командной строки. Как пользователь, я считаю раздражающим, если мне нужно набрать bla.ksh или foo.bash. Также, если кодер решит перейти к другому интерпретатору, имя команды также изменится, и мне придется изменить другие сценарии, использующие эти инструменты - очень раздражает, даже если пользователь и кодер - это один и тот же человек.
Но с другой стороны, я использую расширения, такие как .sh или .tcl, в моих каталогах сборки проекта. Таким образом, я могу использовать функции make для развертывания файлов в каталогах назначения, но на этом этапе я удаляю суффикс файла.
источник
Очевидно, есть некоторые различия между исполняемыми файлами в
bin
каталогах и редактируемыми «исходными» файлами.#!
строку..pm
,.sh
или.so
в таких случаях.В случае скомпилированной программы различие между «исходным» и «исполняемым» очевидно: одно содержит исходный код, другое содержит машинный язык или интерпретируемый байт-код. В случае сценария нет очевидного различия, но
make
команда поддерживает условное разделение между «исходным кодом сценария» и «исполняемой версией сценария»: его «компилятор» по умолчанию для «сценария оболочки» простоcp
,Я бы порекомендовал вести отдельный
$HOME/source
каталог, и либо:ln -s ../source/foo.sh $HOME/bin/foo
; илиinstall -m 755 foo.sh ../bin/foo
; илиMakefile
правила для проверки синтаксиса перед копированием исходного файла$HOME/source
в$HOME/bin
Сноска: оболочка модуль сценария может использоваться только другой сценарием оболочки, и изменяет внутренний контекст этого сценария с использованием
.
илиsource
встроенные командами. Это отличается от исполняемого скрипта, который (как и любая программа) запускается как отдельный процесс и не может изменять свой родительский процесс. Как грубое соглашение, модули входят,/usr/lib/name_of_program/name_of_module.sh
тогда как команды входят/usr/bin/name_of_command
(без суффикса).источник
Это необязательно. Ядро уже проинформировано о правильном используемом интерпретаторе (по
#!
строке), и все популярные текстовые редакторы также читают его, поэтому добавление расширения ничего не даст, только увеличит набор текста. Единственный раз, когда исполняемая программа имеет расширение, это когда оно каким-то образом важно (для программы, пользователя или обоих).Модули и библиотеки, с другой стороны, почти всегда имеют расширения (
.rb
для модулей Ruby,.so
для общих библиотек ELF и т. Д.).источник