Чи слід ставити розширення файлів * .sh та * .rb на всі мої сценарії?


20

У мене в каталозі $ HOME / bin є купа рулонних виконуваних сценаріїв. Деякі написані в баші, деякі в Рубі. Усі вони мають рядок shebang вгорі, вказуючи оболонці, який інтерпретатор використовувати (у моєму випадку bash чи Ruby).

Мені цікаво, чи краще розмістити розширення файлів на цих скриптах, щоб вказати, на якій мові сценаріїв вони написані? Наприклад, сценарії в Ruby мали б суфікс * .rb, а bash - суфікс * .sh.

В даний час у цих скриптів є просто імена без розширення файлу.

Яка найкраща практика?


1
Досить просто перетворити з shebang в розширення і назад за допомогою простого сценарію. Тому спробуйте його і виправте пізніше, якщо вам потрібно.
Аарон Дж Ланг

Відповіді:


9

Ви можете виконувати команди підказки на кшталт ls *.rbабо cp *.shякщо ви хочете впорядкувати свої сценарії в майбутньому.

Почніть рано чи шкодуйте пізніше, на мою думку.

Такі редактори vimтакож зможуть застосувати правильне виділення синтаксису на основі розширення shebang або файла.

Це також можна досягти за допомогою моделей у різних редакторах. Напр. Для vim:

# vim: ft=sh

2
ІМХО, організацію краще виконувати за функціями, а не за деталями реалізації.
grawity

4
@grawity: все-таки впорядкування за суфіксом простіше, ніж прив’язка до shebang ...
akira

Хоча я згоден з глобальною причиною, більшість редакторів досить розумні, щоб прочитати шебанг, щоб визначити тип файлу.
Багата Гомолка

10

Ну - як і більшість речей у житті: Це залежить від ваших потреб.

Ви заявили, що ці сценарії перебувають у директорії bin, і я вважаю, що ці сценарії потрібно викликати з командного рядка. Як користувач я вважаю це дратівливим, якщо мені доведеться вводити bla.ksh або foo.bash. Крім того, якщо кодер вирішить перейти до іншого інтерпретатора, ім'я команди теж зміниться, і мені доведеться вносити зміни до інших скриптів, які використовують ці інструменти - дуже дратує, навіть якщо користувач і кодер - це та сама особа.

Але з іншого боку, я використовую розширення типу .sh або .tcl у своїх каталогах для створення проекту. Таким чином я можу скористатися функціями make для розгортання файлів у їхніх каталогів призначення, але на цьому етапі я видаляю суфікс файлу.


6

Очевидно, є деякі відмінності між виконуваними файлами в 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(без суфіксу).


3

Це не обов'язково. Ядро вже поінформовано про правильний інтерпретатор для використання (за #!рядком), і всі популярні текстові редактори також його читають, тому додавання розширення нічого корисного не зробить, лише збільшить набір тексту. Єдиний раз, коли виконується програма має розширення, коли це якимось чином важливо (для програми, для користувача або обох).


З іншого боку, модулі та бібліотеки майже завжди мають розширення ( .rbдля модулів Ruby, .soдля спільних бібліотек ELF тощо).


питання не стільки в тому, "чи може ядро ​​запустити його, якщо я не надаю суфікс", а про те, "чи допомагає мені". збільшення набраних символів не має значення з завершенням.
akira
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.