Чому б не зробити .txt файл виконуваним замість .sh-файлу для запуску скриптів?


18

Мені було цікаво, у чому полягає необхідність розміщувати виконувані команди всередині .shфайлу, щоб зробити єдиний скрипт, оскільки я можу зробити те ж саме, помістивши команди всередину .txtфайлу та зробивши його виконуваним за допомогою chmod.

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


19
Unix традиційно не піклується про розширення файлів. Тож ти маєш рацію - це не має значення. Це чисто для того, щоб зрозуміти читачеві, що це сценарій оболонки
vidarlo

8
розширення файлів в Linux не використовуються ОС жодним реальним способом. Введення розширення .sh просто повідомляє користувачеві, що це скрипт оболонки, на відміну від деяких інших типів файлів, таких як пітон або скрипт perl. Особисто я не ставлю розширення на свої сценарії.
doneal24

2
Потрібно лише сказати вам або комусь, хто дивиться на нього, що це сценарій оболонки. Якщо вам не байдуже розповідати, які файли .txt - це сценарії для запуску, а які - текст, який слід відкрити в редакторі, сміливо називайте все .txt!
даборосс

2
Right.txt, but.txt if.txt everything.txt ends.txt with.txt the.txt .txt.txt suffix.txt, you're.txt not.txt helping.txt yourself.txt (or.txt anybody.txt ще .txt) розуміння.txt що.txt кожен файл.txt файл.txt is.txt там.txt for.txt.
близько

1
Це схоже на питання, чий це припущенний дублікат, але це питання насправді не відповідає на це.
Кенні Евітт

Відповіді:


47

Немає необхідності, щоб розширення файлу відповідало чомусь конкретному, як ви правильно з'ясували.

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

Перевірте fileкоманду, вона показує вам інформацію, яку вона може дізнатися про тип файлу зі свого вмісту.

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

#!/usr/bin/env python3

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

Тож у системах Unix / Linux розширення імен файлів - це головним чином натяк (але жодна гарантія) для людського користувача швидко розпізнати, що очікувати конкретного файлу. Це також умова, яка може допомогти, наприклад, швидше знаходити файли.

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

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


3
Розширення файлів не мають значення в оболонці, але в світі ОС GUI вам дуже потрібні, щоб подвійне клацання працювало правильно.
BallpointBen

@BallpointBen два пункти не пов'язані між собою. Навіть під GUI "тип" файлу може зберігатися поряд, як метадані, і може викликати конкретне виконання, незалежно від того, чи є розширення. MacOS не має розширень імен файлів і є графічним інтерфейсом, і він дуже добре переживає ...
Патрік Мевзек

1
@PatrickMevzek як у Dows MacOS немає розширень? Я ввімкнув їх показ та всі файли. Я щось пропускаю? Я новачок на платформі MacOS
Ciprian Tomoiagă

1
@ CiprianTomoiagă ви можете називати свої файли будь-де, як вам завгодно, ОС не потребує розширення, щоб правильно працювати над ними. Дивіться наприклад: howtogeek.com/192628/…
Патрік Мевзек

1
@barbecue, орієнтований на найнижчий загальний знаменник ... що може піти не так :-) (наприклад, атаки через файли, що додаються до електронної пошти, які називаються something.com.txt, і робити хитрощі, щоб пропустити .txt як .com як конкретне значення в Windows-land ). Дійсно, розширення файлів сумісності може бути хорошою практикою. Треба навчитися, хоча це явно дефект, введений DOS в основному, і що різні ОС живуть із задоволенням файлами без розширень.
Патрік Мевзек

3

У назві файлу UNIX / Linux немає файлу "розширення" або "типу".

Як зазначали інші, "тип" може бути знайдений за допомогою команди файлів, припускаючи, що відповідна магія доступна у вашій системі. Імена файлів UNIX / Linux зазвичай можуть містити будь-які наявні символи, але часто корисно використовувати певну форму конвенції для цього імені, щоб і люди, і машини могли приймати судження щодо вмісту (а отже, і використання вмісту).

Як приклад, я часто використовую кому як перший символ імені файлу, щоб вказати тимчасовий файл, а не використовувати щось на зразок рядка ".tmp" в кінці імені файлу. Результат такий же, файл, що містить дані, які потрібні лише на короткий час, можливо, але ім'я не вимагає наявності "." всередині нього ні рядка "tmp". Іноді це може мати переваги, наприклад, при розборі списку імен файлів. Але це МОЯ конвенція, і хтось інший може вирішити іншу, навіть використовуючи ".tmp" як своє умовне ім'я для тимчасового файлу.

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


FWIW, я також використовую для себе нестандартну умову. Мої сценарії, імена яких починаються з "."позначаються пунктирною оболонкою (вони не можуть значимо запускатись в нижній частині). Відповідно я вимикаю стандартну умову "початкова точка = прихований файл" у своїх псевдонімах / скриптах, які використовують lsтак, що я можу бачити всі файли, включаючи "приховані". Аналогічно в Windows я відключаю налаштування "приховати розширення файлів".
jrw32982 підтримує Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.