Расширения файлов и связь с программами в Linux

В Windows мы можем связать расширение файла с программами.
Например, файл test.pl может запускаться установленным интерпретатором Perl из-за расширения pl .
В linux, хотя в первой строке требуется #!/usr/bin/perl .
Это потому, что между файловыми расширениями и программами в Linux нет связи?

6 Solutions collect form web for “Расширения файлов и связь с программами в Linux”

Нет, это не значит. Если у вас есть текстовый файл с установленным разрешением выполнения (например, chmod a+x somefile ), а первая строка файла – это что-то вроде

 "#!/path/to/executable" 

Он просто сообщает Unix, какую программу использовать для выполнения скрипта. Если текстовый файл помечен как исполняемый файл (то есть сценарий), Unix запустит любую программу, указанную таким образом, и отправит остальную часть текстового файла (скрипта) в эту программу. Обычно указанная программа будет оболочкой ( /bin/sh , /bin/csh или /bin/bash ), интерпретатором для некоторого языка программирования (Perl, Python или Ruby) или какой-либо другой программой, которая выполняет скрипты (например, текст -манипуляторы Awk или Sed).

Обычно «#» указывает комментарий на многих языках, только если первая строка начинается с «#!» это нечто особенное. Если файл помечен как исполняемый, но не начинается с «#!», Unix будет считать, что это своего рода двоичный файл (например, ELF-исполняемый файл, сделанный C-компилятором и компоновщиком).

В общем, Unix не полагается на суффикс файлов. Многие программы не требуют и автоматически добавляют свои типичные суффиксы, одним исключением являются программы сжатия (такие как gzip и bzip2 ), которые обычно заменяют исходный файл сжатым, добавляя суффикс для обозначения типа сжатия (это один из немногих программы, которые жалуются на неправильный суффикс).

Вместо этого файл идентифицируется содержимым посредством серии тестов, ищет «магические числа» и другие идентификаторы (вы можете попробовать команду «файл» в некоторых файлах, чтобы проверить это). Это также используется файловыми браузерами в GNOME и KDE для выбора значков и списка программ для открытия / редактирования файла. Здесь MIME-тип файла идентифицируется такими тестами, тогда подходящие программы для просмотра и редактирования находятся из списка, связанного с типом MIME, а не с суффиксом, как в Windows.

Поскольку один из тестов состоял в том, чтобы проверить, является ли первая строка текстового файла «#! / Something», а затем посмотреть, что такое «что-то»; вы могли бы сказать, например, что #!/usr/bin/perl идентифицировали файл как perl-скрипт, но это скорее побочный эффект. В любом случае, это содержимое файла, которое используется для его идентификации, а не произвольный суффикс. Таким образом, окончания, такие как .pl (Perl) и .awk (Awk), предназначены исключительно для того, чтобы помочь человеку идентифицировать тип файла, он не используется Unix для определения типа (например, суффиксов в Windows).

Фактически вы можете создать «скрипт» без «#! / Something», но Unix не сможет автоматически запускать его как исполняемый файл (он не знает, какую программу запускать скрипт). Вместо этого вам придется «вручную» запустить его с чего-то вроде perl myscript или python myscript . Многие сценарии в более крупных приложениях Python и Perl на самом деле не начинаются с «#! / Something», так как они являются сценариями для «внутреннего использования» и не предназначены для непосредственного вызова пользователем.

Вместо этого вы начнете основной сценарий (который начинается с «#! / Something»), а затем он передаст эти другие скрипты интерпретатору по мере запуска этого скрипта.

В Windows мы можем связать расширение файла с программами. Например, файл test.pl может запускаться установленным интерпретатором Perl из-за расширения pl.

Правильно, но расширение – это просто намек на тип файла. Синтаксический скрипт perl по-прежнему является синтаксическим скриптом perl, независимо от того, называется ли он «.pl» или «.exe» или «.doc». Вы все равно можете выполнить его, вызвав, например, интерпретатор; perl.exe thisfile.doc будет работать, если файл является perl-синтаксическим файлом. Также можно связать «.blah» с файлом perl, если хотите.

В linux, хотя в первой строке требуется #! / Usr / bin / perl.

Опять же, это всего лишь намек. Вы все равно можете вызвать файл perl без shebang в нем, напрямую вызывая скрипт в качестве аргумента для команды perl .

Это потому, что между файловыми расширениями и программами в Linux нет никакой связи

Технически, да, есть.

Linux фактически имеет несколько способов идентифицировать исполняемый формат. Эта команда иллюстрирует эту команду. Он содержит базу данных «магия» (строки определенной длины при определенных смещениях), чтобы определить, какой тип файла есть. Он делает это, проверяя содержимое файла, чтобы выяснить, что это такое. Другой способ сделать это – с расширением файла. Вы можете зарегистрировать, какое поведение вы хотите, используя систему под названием «binfmt_misc». Википедия объясняет, как это работает (используя «волшебство» и расширения файлов).

Файл произвольно считается «исполняемым» в linux по понятию «исполняемого» бита в разрешениях файла. Когда вы пытаетесь запустить приложение с исполняемым битом, ядро ​​будет читать первые несколько байтов файла, чтобы определить, что делать.

  • Если файл начинается с #! затем вызовите команду в указанном пути и сделайте следующий файл последним аргументом этой команды.
  • Если файл начинается с ELF, запустите /lib{64}/ld-linux.so (это действительно /lib{64}/ld-linux.so из заголовка раздела двоичного файла ELF, его не используется только статический путь), за которым следует команда (это выполняет последовательность статической загрузки библиотек).
  • Посмотрите, какие правила применимы к binfmt_misc.

a.out, я не слишком хорошо знаком с их invokation – я предполагаю, что загрузчик ld -linux.so все еще обрабатывает их.

Строка shebang (#!) Используется, чтобы указать, какую версию Perl вы используете, а также вызывать скрипт непосредственно из оболочки

 ./myscript.pl 

Вы можете сделать это также без линии shebang:

 perl myscript.pl 

Вы просто не можете делать такие сравнения, не то, что GNU / Linux не имеет связи между расширениями файлов и программами, потому что GNU / Linux на самом деле не заботится об этом.

У вас есть права доступа к файлам, и если ваш файл является исполняемым, он ВСЕГДА будет искать shebang в первой строке любого скрипта, чтобы посмотреть, как его выполнить.

С другой стороны, двоичные файлы Linux ELF не имеют расширений exe, как это делают двоичные файлы Windows, и они всегда исполняются, даже без ЛЮБОГО расширения.

Нет, это не так. Shebangs ( #! ) И ассоциации между типами файлов и приложениями используются в разных целях, и вы можете найти их в настольных дистрибутивах Linux.

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

Последний служит пользователям, которые нажимают на значки или имена файлов на рабочем столе. В мире Linux это связано с привязкой типов MIME к приложениям , которые, конечно же, обрабатываются конкретными инструментами и не требуют чтения спецификации от обычных пользователей настольных компьютеров.

Да. В Linux нет поддержки расширений. Вы правы в первой строке, то есть в строке shebang. Он используется для определения того, какую программу использовать для запуска файла, например, в окнах есть расширения файлов.

Даже если вы видели что-то вроде .sh .pl в конце в linux, им просто дают понять тип файла просто, глядя.

В окнах расширения означают все, и на их основе будет использоваться правильное приложение для его запуска. Например: .xls означает, что файл Excel, .doc означает, что Word Doc, .exe считается исполняемым, то же самое в linux, но вам нужно предоставить права выполнения для файла, а затем вы можете запускать его как ./filename .

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

  • Почему файлы tar и gzip обычно имеют расширение файла?
  • Два пользователя с разными разрешениями в одном каталоге
  • Удалите все файлы в каталоге, имя которого не соответствует строке в списке файлов.
  • как искать файл для начала строки и сохранять переменную
  • Как разрешить группе читать или редактировать файлы без права на archlinux?
  • Сравните 1-й столбец в 2 файлах и замените третий столбец файла 1 на 4-й столбец файла 2
  • Как перемещать строку из одной строки в другую
  • Как узнать, сколько строк содержит текстовый файл, не просматривая его?
  • Что такое консультативная блокировка файлов, которые обычно используют системы Unix?
  • Является ли таблица файлов в файловой системе или в памяти?
  • Присоединение файлов на диске
  • Linux и Unix - лучшая ОС в мире.