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

Я недавно взглянул на rinetd (~ports/net/rinetd).

Это - очень простой редиректор порта (от одного IP/порта до другого). Перенаправление сделано через его конфигурационный файл rinted.conf:

# bindadress    bindport  connectaddress  connectport
1.2.3.4         8080      4.3.2.1         80 

Отклоните обычно используется для более широких выборов портов (т.е. как все от 1 интерфейса до natd ;).

2
07.04.2013, 02:26
6 ответов

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

Право, но расширение является просто подсказкой о типе файла, который это. Жемчуг syntaxed сценарий является все еще жемчугом syntaxed сценарий независимо от того, если это называют ".pl" или ".exe" или ".doc". Можно все еще выполнить его путем вызова интерпретатора непосредственно, например; perl.exe thisfile.doc будет работать, если файл будет жемчугом syntaxed файл. Можно также связать '.blah' с тем, чтобы быть файлом жемчуга также, если Вы хотели.

В Linux, хотя этому нужен #!/usr/bin/perl как первая строка.

Снова, это - просто подсказка. Можно все еще назвать файл жемчуга без хижины в нем путем прямого вызова сценария как аргумента perl команда.

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

Технически, да существует.

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

Файл произвольно считает 'исполняемым файлом' в Linux понятие 'executuable' бита на полномочиях файла. Когда Вы пытаетесь запустить приложение, которое имеет исполняемый бит, ядро считает первые несколько байтов файла для определения, что сделать.

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

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

4
27.01.2020, 21:49

Нет, это не означает это. Если у Вас есть текстовый файл, который имеет, это - выполнять-набор-полномочий (например. 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"), и затем он передаст эти другие сценарии интерпретатору, когда этот сценарий работает.

7
27.01.2020, 21:49
  • 1
    сценарий без хижины предназначен, чтобы быть интерпретированным оболочкой системы (то, когда execve () возвращает ENOEXEC и файл, не обнаруживается как являющийся двоичным). –  Stéphane Chazelas 28.05.2014, 09:42

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

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

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

1
27.01.2020, 21:49
  • 1
    if your file is executable, it will ALWAYS search for the shebang at the first line of any script to look on how to execute it Таким образом без этой строки, Linux не знает, как выполнить сценарий жемчуга? –   05.04.2013, 23:02
  • 2
    Да, и затем Вы должны perl script.pl преподавать Bash на самом деле, не Linux по сути. –   05.04.2013, 23:03
  • 3
    Таким образом, в отличие от этого, Windows Я любой делает: perl script.pl или ./script.pl с #!/usr/bin/perl как первая строка? Таким образом, нет никакой реальной ассоциации между расширениями и программами в Linux? –   05.04.2013, 23:06
  • 4
    Linux's ELF binaries, on the other hand, does not have exe extensions as windows binaaries does, and they are always executables, even without ANY extension. Это не совсем настолько точно. Двоичные файлы ELF всегда являются двоичными файлами ELF, файлы жемчуга всегда являются файлами жемчуга. Но ELF является не обязательно исполняемым файлом непосредственно (библиотеки, и модули ядра являются двоичными файлами ELF, но не exectuable). –  Matthew Ife 05.04.2013, 23:08
  • 5
    я могу выполнить библиотеки по Linux. попробуйте это: /lib/libc.so.6 и наблюдайте выходной ;) –   06.04.2013, 00:53

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

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

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

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

0
27.01.2020, 21:49

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

./myscript.pl 

Можно сделать это также без строки хижины:

perl myscript.pl
1
27.01.2020, 21:49
  • 1
    Но если бы у меня просто есть 1 версия, мне все еще была бы нужна она? Все учебные руководства и примеры имеют эту строку. –   05.04.2013, 22:52
[1131358] Нет, это не так. Шебанги ([1131731]#![1131732]) и ассоциации между типами файлов и приложениями служат разным целям, и их можно найти как в дистрибутивах desktop Linux, так и в исполняемых скриптах, вызываемых из командной строки или из других скриптов, и это не зависит от расширений файлов. Аналогичную функциональность можно получить в Windows через переменную окружения PATHEXT, которая действительно зависит от расширений файлов.[12191]Вторая обслуживает пользователей, которые нажимают на иконки или имена файлов в интерфейсе рабочего стола. В мире Linux это происходит от [1131733]ассоциирования MIME-типов с приложениями[1131734], что, конечно же, обрабатывается специальными инструментами и не требует чтения спецификации от типичных пользователей настольных компьютеров.[1131363].
1
27.01.2020, 21:49

Теги

Похожие вопросы