Розширення файлів для скриптів оболонки Unix [закрито]


45

У Вікіпедії стаття для .sh говорить:

Тип розширення файлу .sh див . У оболонці Bourne .

Як щодо інших оболонок Unix?

Я знаю, що шебанг використовується у файлі для позначення перекладача для виконання, але мені цікаво:

  • Які плюси та мінуси розширень файлів проти розширень файлів?

4
Іноді можуть бути знайдені сценарії оболонок без shebang (або без дозволів exec). У такому випадку ім'я, що закінчується на .sh, може бути підказкою для користувача, щоб запустити їх bash script.sh(або sh, звичайно).
Ansgar Esztermann

3
Якщо скрипт оболонки має розширення, це зазвичай .sh. Я ніколи не бачив сценарію .ksh або .bash. Більшість скриптів оболонки не мають розширення, як і всі сценарії в /etc/init.d/* як приклад.
Річард Холлоуей

Хоча спрощений висновок (так чи ні) - це думка, речі, які слід враховувати, не є.
ctrl-alt-delor

Відповіді:


35

Я б назвав лише .shте, що повинно бути портативним (і, сподіваюся, є портативним).

Інакше я думаю, що краще приховати мову. Уважний читач все одно знайде його в рядку shebang. (На практиці .bashабо .zshтощо. Суфікси використовуються рідко.)


1
Лише з цієї сторінки ми вже можемо бачити досить нетривіальну кількість людей, які її використовують. Чому ви кажете, що їх "рідко використовують"? Будь-які цитати? Або це базується лише на вашому досвіді?
Pacerier

23

Я б сказав, що ніяких "хороших практик" для розширень файлів не існує суто з технічної точки зору: файлові системи Unix / Linux / * BSD самі по собі не підтримують розширення. Те, що ви називаєте розширенням, - це лише суфікс одного імені файлу. Це відрізняється від файлових систем та ОС Windows VM / CMS, VMS, MS-DOS та Windows, де для розширення відведено спеціальне місце в еквіваленті inode-мораль.

Ця маленька рента зараз закінчилася, я думаю, що трохи нерозумно вводити суфікс ".sh" або ".ksh" або ".bash" на ім'я файлу скрипту оболонки. Програма - це програма: ніякої користі у розрізненні того, що виконується, не існує. Жоден unix чи linux чи будь-яке інше ядро ​​не вирішило викликати інтерпретатора на якийсь файл лише через суфікс імені файлу. Все це робиться за #!рядком, або якоюсь іншою послідовністю байтів "магічне число" на початку файлу. Насправді, вирішення того, що виконати на основі імені файлу "розширення", є одним із факторів, що робить Windows магнітом зловмисного програмного забезпечення. Подивіться, скільки афери зловмисного програмного забезпечення Windows включає файл з назвою "something.jpg.exe" - за замовчуванням новіша Windows не показує розширення ".exe", і рекомендуйте користувачеві двічі клацнути на "

Те, що ви можете подумати як пряму команду, так чи інакше - це сценарій оболонки. Іноді ccбув sh-скриптом, firefoxsh-скриптом, startxsh-скриптом. Я не вірю, що маркування сценарію суфіксом ".sh" має пізнавальну чи організаційну користь.


24
Я не погоджуюсь! Моя робота полягає в упаковці програми, що включає тисячі файлів, починаючи від двійкових виконуваних файлів до скриптів оболонки (ksh, bash та деякі застарілі csh). По-моєму, повірте, це має значення, щоб ми могли з першого погляду (або в регулярному вираженні) дізнатися, який файл ми обговорюємо і шукаємо. Я можу сказати, що може бути користь у розрізненні того, що виправдовуються, а найкраща практика повинна заохочувати чітко заявляти тип файлу.
rahmu

4
@rahmu: написати це як відповідь. Надайте деякі конкретні відомості про те, як імена, що відрізняються від виражених виразів, допомагають вам упакувати (і, можливо, підтримувати) цю програму. Зокрема, зверніть увагу на взаємодію між тим, що інтерпретує файл, та суфіксом імені файлу, і тим, як це допомагає виконувати завдання. Мене цікавлять серйозні аргументи проти моєї точки зору, і я готовий змінити, якщо в цьому переконаюся. Я підтримав ваш коментар, щоб довести це.
Брюс Едігер

3
Я б хотів, щоб, на жаль, можу говорити лише про свій теперішній досвід моєї нинішньої роботи. Я мало знаю про добру практику та стандарти загалом ; Я відчуваю, що мені слід зробити кілька досліджень, перш ніж публікувати відповідь тут. Я
вивчу

2
@rahmu Для визначення типу файлу існує команда "файл". Він здатний розрізняти сценарії, написані для різних оболонок.
Метт

3
Якщо ви надаєте .shрозширення скрипту оболонки , вам доведеться вводити це .shяк частину імені команди при його запуску. Ось основна причина, чому мені не подобається вводити це розширення (те саме, що має лінію shebang). До речі, проблема в Windows - це не .exeпрефікс сам по собі (все-таки банально зробити виконаний файл з іменем image.jpgLinux, зрештою), а те, що Windows зазвичай приховує це розширення, поєднане з тим, що необхідні дії для запуску виконуваного файлу та відкрити документ точно так само.
celtschk

12

Як той, хто працював у безлічі найменших середовищ, мені доводилося писати в найрізноманітніших оболонках. Вірите чи ні, на платформах оболонки не однакові. Тож якщо ви підтримуєте свою особисту бібліотеку в декількох оболонках (коли це необхідно), дуже корисно використовувати розширення для ідентифікації оболонок. Таким чином, коли ви переходите на іншу платформу, і оболонка трохи відрізняється, ви знаєте, на які сценарії слід орієнтуватися на модифікації. .ш .кш .бш .чш ...


Здається, це погоджується з unix.stackexchange.com/questions/31760/…
Pacerier

У вас немає #!на початку сценарію (наприклад #!/bin/bash)?
ctrl-alt-delor

Gnu / Linux, BSD і UNIX - все це Unix. Не потрібно? Nix. Linux - це ядро, а Android використовується Linux, але це не Unix (якщо ви не додаєте додаткове програмне забезпечення; у цьому випадку у вас є додаток Unix).
ctrl-alt-delor

@ ctrl-alt-delor: "Unix" є торговою маркою . Люди часто використовують "nix", щоб уникнути випуску торгової марки (та педантів).
JS.

@JS `UNIX 'є торговою маркою The Open Group. Unix і unix не є greens.org/about/unix.html
ctrl-alt-delor

5

Як ви вже говорили, розширення файлів Unix - це суто інформація. Вам просто потрібен ваш сценарій, щоб мати правильний шебанг і виконувати його.

Ви не можете мати розширення або використовувати .sh.

Я особисто використовую такі умови, незалежно від використовуваної оболонки (csh, tcsh, bash, sh, ...):

  • відсутні розширення для системних або висококласних сценаріїв (вкрай рідко).
  • .shдля класичних сценаріїв, від низького до високого класу.

Що ви маєте на увазі під «класичними сценаріями, від низького до високого рівня»?
Pacerier

Я думаю, я мав на увазі абстракцію чи рівень організації цим. Тобто вам не байдуже, який інструмент мова / скрипт використовується за деякими командами: тому ви не використовуєте жодного розширення. Для інших добре відомо, що це баш або якийсь екзотичний скрипт оболонки ksh (з належним розширенням). ... але це було 2 роки тому;)
Укі

5

Не слід використовувати розширення для виконуваних файлів, оскільки вони не є взаємозамінними. Уявіть, що у вас є сценарій оболонки a.sh, потім перепишіть у python a.py, тепер вам потрібно змінити кожну програму, яка викликає вас сценарій, ви просочилися деталями реалізації.

Весь факт розширення імені файлів у Windows Mircosoft - це безлад: наприклад, що могло бути a.audio, b.audio, c.audio, є a.mp3, b.wav, c.oggі d.picture, e.picture, f.pictureє d.jpeg, e.png, f.gif. Більшу частину часу нам не байдуже, у якому форматі знаходиться аудіо чи зображення. Нам також доведеться витрачати довгий час, навчаючи нових користувачів усім розширенням файлів.


Ще одна причина не використовувати *.shя щойно зіткнувся з тим, що Debian не run-partsбуде запускати сценарії з розширеннями, як-от у /etc/cron.*/: archive.oreilly.com/pub/post/runparts_scripts_a_note_about.html
Росс Паттерсон

3

Розширення скриптів Shell є досить корисними. Наприклад, я часто пишу сценарії з декількома файлами на декількох мовах (наприклад, bash, awk та lua) в один і той же каталог. Якщо мені потрібно шукати рядок лише у файлах bash, розширення робить це дуже зручно, щоб зменшити помилкові позитиви. Або якщо я хочу зробити підрахунок рядків всього мого баш-коду для цього проекту.

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


Здається, це погоджується з unix.stackexchange.com/questions/31760/…
Pacerier

2

Як говорили інші, оболонку не цікавлять розширення. Однак це дозволяє швидко визначити людину файлів. Я бачу файли, що закінчуються на .pyабо .shшвидко знаю, якими вони мають бути (принаймні). Як каже Стів, пошук за розширенням файлів або підрахунок рядків також є практичними міркуваннями.

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