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

18

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

Я предполагаю, что это может быть сделано с любым из расширений файлов. Таким образом, я совершенно смущен необходимостью .shрасширения. Любая помощь приветствуется.

Абхик Бхаттачарджи
источник
19
Unix традиционно не заботится о расширениях файлов. Так что вы правы - это не важно. Это просто, чтобы сделать очевидным для читателя, что это сценарий оболочки
vidarlo
8
Расширения файлов в Linux не используются ОС каким-либо реальным способом. Размещение расширения .sh просто говорит пользователю, что это сценарий оболочки, а не какой-то другой тип файла, например сценарий python или perl. Лично я не ставлю расширения на свои скрипты.
doneal24
2
Нужно только сказать вам или кому-либо еще, смотрящему на него, что это скрипт оболочки. Если вам не нужно сообщать, какие файлы .txt являются сценариями для запуска, а какие - текстом, который нужно открыть в редакторе, смело называйте все .txt!
Даборосс
2
Right.txt, но .txt if.txt everything.txt заканчивается.txt с .txt.txt the.txt .txt Суффикс.txt, вы не можете.txt.txt help.txt сами.txt (или .txt anybody.txt еще .txt) понимание.txt что.txt каждый.txt файл.txt is.txt есть.txt для.txt.
оставил около
1
Это похоже на вопрос о том, какой это предполагаемый дубликат, но этот вопрос на самом деле не отвечает на этот.
Кенни Эвитт

Ответы:

47

Как вы правильно выяснили, расширение файла не должно совпадать с чем-то конкретным.

В Unix-подобных системах типы файлов обычно определяются содержимым файла (т. Е. «Магическим числом» или другими характеристическими структурами в первых нескольких байтах), а не их именем. Вы также можете полностью опустить расширение, что часто делается для исполняемых файлов.

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

Для исполняемого скрипта система ожидает так называемый «шебанг» в первой строке, который выглядит, например, как

#!/usr/bin/env python3

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

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

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

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

Byte Commander
источник
3
Расширения файлов не имеют значения в оболочке, но в мире операционных систем с графическим интерфейсом они нужны, чтобы двойной щелчок работал правильно.
BallpointBen
@BallpointBen две точки не связаны. Даже в графическом интерфейсе «тип» файла может храниться вместе как метаданные и может запускать конкретное выполнение независимо от того, имеет ли расширение расширение. MacOS не имеет расширений имен файлов и является графическим интерфейсом и хорошо его переживает ...
Патрик Мевзек,
1
@PatrickMevzek, как у MacOS нет расширений? Я включил их показ, и у всех файлов они есть. Я что-то пропустил ? Я новичок в платформе MacOS
Ciprian Tomoiagă
1
@ CiprianTomoiagă, вы можете называть свои файлы так, как вам нравится, для правильной работы ОС не требуется расширение. Смотрите, например: howtogeek.com/192628/…
Патрик Мевзек,
1
@ барбекю, нацеленный на наименьший общий знаменатель ... что может пойти не так с этим :-) (например, атаки через вложенные в электронную почту файлы, называемые нечто.com.txt, и выполнение трюков, чтобы пропустить .txt как .com как конкретное значение в Windows-land ). Действительно, для совместимости расширения файлов могут быть хорошей практикой. Однако нужно понять, что это явный недостаток, введенный DOS в основном, и что различные ОС прекрасно живут с файлами без расширений.
Патрик Мевзек
3

В имени файла UNIX / Linux не существует такого понятия, как расширение или тип файла.

Как уже отмечали другие, «тип» можно найти с помощью команды file, предполагая, что соответствующая магия доступна в вашей системе. Имена файлов UNIX / Linux обычно могут содержать любой доступный символ, но часто полезно использовать некоторую форму соглашения для имени, чтобы и люди, и машины могли принимать решения относительно содержимого (и, следовательно, использования содержимого).

В качестве примера я часто использую запятую в качестве первого символа имени файла для обозначения временного файла, а не что-то вроде строки «.tmp» в конце имени файла. Результат тот же, файл, содержащий данные, которые, возможно, требуются только в течение короткого времени, но имя не обязательно должно иметь «.» внутри него ни строки "tmp". Иногда это может иметь преимущества, например, при разборе списка имен файлов. Но это МОЕ соглашение, и кто-то другой может выбрать другое, даже используя ".tmp" в качестве соглашения имени временного файла.

Поэтому я отвечу вам, что не существует такого понятия, как расширение файла UNIX / Linux, а просто набор соглашений, которые обычно выглядят как расширения файлов, используемые в других операционных системах и их файловых системах.

PJF
источник
Я также использую нестандартное соглашение для себя. Мои сценарии, чьи имена начинаются с ".", должны быть расставлены точками в оболочке (они не могут содержательно выполняться в подоболочке). Соответственно, я отключаю стандартное соглашение «исходная точка = скрытый файл» в моих псевдонимах / сценариях, которые используют, lsчтобы я мог видеть все файлы, включая «скрытые». Аналогично в Windows я отключаю параметр «скрывать расширения файлов».
jrw32982 поддерживает Монику