Jak Linux wybiera aplikację do otwarcia pliku?

38

Jeśli plik informuje system operacyjny o jego formacie, w jaki sposób system operacyjny wybiera, która aplikacja ma go domyślnie otworzyć?

Czy w systemie Windows skojarzenie jest przechowywane w tabeli rejestru?

Jak Linux wybiera aplikację do otwarcia pliku?

Kiedyś często korzystałem z Nautilusa, ale teraz zmieniam na terminal. Czy to prawda, że ​​w terminalu zawsze musimy wyraźnie określić, która aplikacja ma otworzyć plik? Czy ustawienia aplikacji, która domyślnie otwiera plik określonego formatu, należą do menedżera plików (np. Nautilus) i czy nie jest to problemem, kiedy mieszkamy w terminalach?

Tim
źródło
24
Linux to tylko jądro systemu operacyjnego. Podejrzewam, że masz tu na myśli środowisko pulpitu lub menedżera plików . Prawdopodobnie będzie inaczej w systemach operacyjnych Android, ChromeOS, Linux (lub innych niż Linux) z systemem KDE, Gnome, XFCE ... lub innym)
Stéphane Chazelas
prawdopodobnie. Nie wiem, która funkcja działa. Używam gnoma, ale chciałbym też wiedzieć o generale.
Tim
Następnie wyjaśnij system operacyjny i środowisko pulpitu oraz aplikację. Jak nautilus w Ubuntu 12.04 z pulpitem „jedności”.
Stéphane Chazelas
(1) Jestem pod Ubuntu 12.04. Czy mój pulpit to Gnome czy „Unity”? (2) Często używałem Nautilusa, ale teraz zmieniam na terminal. Czy to prawda, że ​​w terminalu zawsze musimy wyraźnie określić, która aplikacja ma otworzyć plik? Czy ustawienia aplikacji, która domyślnie otwiera plik określonego formatu, należą do menedżera plików (np. Nautilus) i czy nie jest to problemem, kiedy mieszkamy w terminalach?
Tim

Odpowiedzi:

35

Mogą istnieć różne mechanizmy obsługi tych ustawień domyślnych. Jednak inne odpowiedzi zwykle koncentrują się na kompletnych środowiskach komputerowych, z których każda ma własny mechanizm. Jednak nie zawsze są one instalowane w systemie (często używam OpenBox), w tym przypadku xdg-openmożna użyć takich narzędzi .

Cytując Arch Wiki :

xdg-open to niezależne od pulpitu narzędzie do konfigurowania domyślnych aplikacji użytkownika. Wiele aplikacji wywołuje wewnętrznie polecenie xdg-open.

W tej chwili używam Ubuntu (12.04) i xdg-openjest dostępny. Jednak w przypadku korzystania z pełnego środowiska pulpitu, takiego jak GNOME, xdg-opendziała on jako prosty program do przesyłania dalej i przekazuje żądania dotyczące plików do DE, który może je dowolnie obsłużyć (na przykład zobacz inne odpowiedzi dla GNOME i Nautilusa) .

W środowisku pulpitu (np. GNOME, KDE lub Xfce) xdg-open po prostu przekazuje argumenty do aplikacji otwierającej pliki tego środowiska pulpitu (odpowiednio gvfs-open, kde-open lub exo-open), co oznacza, że powiązania są pozostawione środowisku pulpitu.

... co prowadzi cię do innych odpowiedzi w tej sprawie. Mimo to, ponieważ jest to Unix i Linux, a nie Zapytaj Ubuntu:

Gdy nie zostanie wykryte żadne środowisko pulpitu (na przykład gdy uruchomimy samodzielny menedżer okien, np. Openbox), xdg-open użyje własnych plików konfiguracyjnych.

W sumie:

                            |-- no desktop env. > handle directly.
User Request > xdg-open > --|
                            |-- desktop env.    > pass information to the DE.

Jeśli pierwszy przypadek, musisz skonfigurować xdg-openbezpośrednio , za pomocą xdg-mimepolecenia (które pozwoli ci również zobaczyć, która aplikacja ma obsłużyć który plik). W drugim przypadku ...

                        |-- GNOME? > gvfs-open handles the request.
                        |
Info. from xdg-open > --|-- KDE?   > kde-open handles the request.
                        |
                        |-- XFCE?  > exo-open handles the request.

... musisz skonfigurować otwieracz plików powiązany ze środowiskiem pulpitu. W niektórych przypadkach dokonana konfiguracja xdg-mimemoże zostać przekierowana do odpowiedniego narzędzia konfiguracyjnego w twoim środowisku.

John WH Smith
źródło
11
W idealnym świecie Gnome i KDE używają ustawień xdg, aby wybrać aplikację do otwarcia pliku, i zapewniają interfejsy użytkownika do zmiany opcji xdg. Wtedy moglibyśmy mieć tylko jedną bazę danych ustawień, zamiast jednej dla każdego DE. Niestety xdg pojawił się za późno.
joeytwiddle
2
W idealnym świecie nie byłoby trzech DE.
Russell Borogove
1
@ RussellBorogove - wszyscy powinniśmy przejść do systemu Windows. To idealny świat.
don_crissti
@don_crissti Myślę, że to bardziej oznaczało „idealny dla programisty lub administratora”. Chociaż oferowanie różnorodności użytkownikom końcowym jest świetną rzeczą, projektanci mogliby skupić się na jednym systemie o wiele łatwiej (choć niekoniecznie „lepiej”). xdg-openjest tylko jednym z tych elementów, które starają się połączyć oba końce razem.
John WH Smith
1
@John - o administratorach i różnych aplikacjach deweloperzy / projektanci: zgodzili się ... ale później twórcy oprogramowania mogą zrobić tylko tyle. W idealnym świecie, zamiast narzekać na to lub tamto, wszyscy wnosilibyśmy wkład w projekty upstream, takie jak KDE, Gnome itp. W celu poprawy użyteczności i iteracyjności między DE. Gdybyśmy wszyscy (miliony) podjęli niewielki wysiłek, wszystkie te problemy zostałyby rozwiązane za kilka dni.
don_crissti
11

Z wiki wpisu,

GUI oparte na systemie Linux, takie jak KDE i GNOME, obsługują skojarzenia oparte na typach MIME. Na przykład tekst / zwykły typ MIME byłby powiązany z edytorem tekstu.

Również ta odpowiedź zawiera więcej szczegółów.

Menedżer plików często używa kombinacji kombinacji opcji a i b (np. Najpierw spójrz na rozszerzenie pliku, jeśli nie jest znane (lub plik nie ma rozszerzenia), spójrz na zawartość).

Typ pliku nie jest przechowywany jako metadane w popularnych systemach plików Linux.

Z tej odpowiedzi widzę poniższe informacje.

Menedżer plików (domyślnie Nautilus) używa typu MIME pliku, aby określić, za pomocą którego programu go otworzyć. Gdy aplikacja jest zainstalowana, może określić, jakie typy MIME może otworzyć, oraz polecenie, które należy użyć, aby otworzyć pliki w pliku .desktop, który jest umieszczony w / usr / share / applications. Jest to plik używany do menu, skrótów pulpitu itp.

Ramesh
źródło
1
Moje pytanie brzmi „biorąc pod uwagę typ formatu pliku”, określa, która aplikacja ma otworzyć plik.
Tim
11

Plik nie informuje systemu operacyjnego o jego formacie, z jednym wyjątkiem:

Jeśli plik wykonywalny zaczyna się od tak zwanej linii shebang, np

#! /usr/bin/perl

następnie ten wiersz informuje jądro Linuksa, że ​​należy go uruchomić /usr/bin/perl(to znaczy, zamiast wykonywać ten plik, powinien on wykonać usr/bin/perli podać ten plik jako argument). To oczywiście działa tylko z formatami plików, które ignorują (lub rozumieją) taką linię shebang.

Poza tym system operacyjny jako taki nie wie nic o typach plików. Jednak wiele programów, które umożliwiają otwieranie innych plików, ma własny mechanizm decydujący, który program ma zostać użyty do otwarcia tego pliku. Może to być lista wewnątrz samego programu (na przykład Firefox utrzymuje taką listę) lub program może przekazać ją do środowiska pulpitu (których jest kilka dla Linuksa).

Zazwyczaj te mechanizmy uwzględniają nazwę pliku tylko w celu podjęcia decyzji o typie pliku; wyjątkiem są klienci poczty e-mail i przeglądarki internetowe, w których typ pliku jest jawnie podany przez serwer / podany w wiadomości e-mail.

Mechanizm jest zwykle dwuetapowy:

  • Po pierwsze, na podstawie nazwy pliku lub dostarczonych informacji określ typ MIME pliku (typ MIME jest znormalizowaną, ale rozszerzalną listą typów plików).
  • Po drugie, na podstawie typu MIME określ, który program ma zostać wykonany, zwykle za pomocą rejestru prowadzonego przez sam program lub przez środowisko pulpitu, dla którego program został napisany.
celtschk
źródło
dzięki. Czy to prawda, że ​​w terminalu zawsze musimy jawnie określić, która aplikacja ma otworzyć plik (oprócz skryptu z shebang)? Czy ustawienia aplikacji, która domyślnie otwiera plik określonego formatu, należą do menedżera plików (np. Nautilus), podczas gdy nie jest to problemem, gdy mieszkamy w terminalach?
Tim
Jeśli chcesz użyć skojarzeń Gnome z wiersza poleceń, możesz użyć polecenia gnome-open. Jestem pewien, że istnieją podobne narzędzia wiersza poleceń dla innych środowisk pulpitu. Edycja: Po prostu zauważam, że John WH Smith wydaje polecenie niezależne od środowiska pulpitu.
celtschk
6
Korekta : linia shebang nie jest wiadomością dla jądra; to wiadomość dla powłoki .
Kazark,
1
@Kazark: coderwall.com/p/pdg77q
celtschk
2
Ponieważ link do rzeczywistego kodu na tej połączonej stronie nie działa teraz, oto kolejny link do kodu jądra obsługującego linie shebang : lxr.free-electrons.com/source/fs/binfmt_script.c - oczywiście możesz również po prostu zainstaluj źródła jądra i zajrzyj do pliku.
celtschk
4

Odbywa się to podobnie do MS-Windows.

Nie jest to wykonywane przez system operacyjny. Odbywa się to przez menedżera plików, część systemu okienkowego. Zwykle .do podjęcia decyzji używana jest część nazwy pliku po ostatniej kropce . Istnieje sposób, aby ustawić je w ustawieniach lub po kliknięciu pliku prawym przyciskiem myszy.

Tak więc plik nie informuje systemu operacyjnego, plik nie jest aktywny, więc nie może samodzielnie nic zrobić, ale menedżer plików patrzy na nazwę pliku, menedżer plików może również zaglądać do pliku, podobnie jak filenarzędzie.

ctrl-alt-delor
źródło
Prawdopodobnie w systemie Windows nie jest to samo przez menedżera plików. Każda aplikacja może wywołać shell32!ShellExecute(), i chociaż shell32 jest częścią systemu Windows Shell, to nie jest częścią Windows Explorer, która jest domyślny menedżer plików.
Ruslan
3

Jak mówi @richard, jest podobny do Windows. Ogólny menedżer plików może najpierw spojrzeć na nazwę pliku i spróbować rozpoznać rozszerzenie pliku powiązane z programem. Jeśli to się nie powiedzie, może spróbować otworzyć plik i poszukać nagłówka. Jeśli spróbujesz odczytać plik nietekstowy (powiedzmy .jpeg), zobaczysz ciąg danych opisujący ten plik. Na przykład jest to pierwsza linia pliku .jpeg, który miałem wokół:

'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xfe\x00;CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 90'

KidElephant
źródło
2
Niektórzy menedżerowie plików analizują zawartość pliku przed rozszerzeniem nazwy pliku (być może nawet zawsze ignorują to rozszerzenie, nie jestem pewien). Np. W Dolphin KDE, jeśli masz obrazy GIF powiązane z przeglądarką i PNG z przeglądarką obrazów, zmiana nazwy file.pngpliku PNG na file.gifnadal otworzy przeglądarkę obrazów. A jeśli opróżnisz plik, otworzy się on w edytorze tekstu.
Ruslan
3

Spróbuję udzielić podstawowej odpowiedzi, w jaki sposób systemy uniksowe obsługują pliki. Jak zauważyli inni, sformułowanie pytania jest mylące, ponieważ same pliki nie informują o ich typie, a samo jądro nie decyduje, których aplikacji użyć.

W systemach operacyjnych Unix i Windows pliki mają prostą sekwencję bajtów. Z systemów operacyjnych Tanenbaum , trzecie wydanie:

W efekcie system operacyjny nie wie ani nie dba o zawartość pliku. Wszystko, co widzi, to bajty. Wszelkie znaczenia muszą narzucać programy na poziomie użytkownika.

Dlatego w środowisku pulpitu xdg-opensłuży do określania domyślnych aplikacji do otwierania określonych typów plików.

W systemie Unix pliki są rozróżniane na zwykłe i specjalne . Zwykły plik to tylko dane użytkownika, które mogą być plikiem tekstowym (kodowanie ASCII lub Unicode) lub binarnym (kod wykonywalny). Pliki specjalne to pliki niezbędne do uruchomienia systemu operacyjnego. Należą do nich katalogi, łącza, potoki, gniazda i pliki urządzeń. ¹

Zgodnie z konwencją nazwy plików zawierają rozszerzenia wskazujące, jaki to może być typ pliku, np. * .C dla kodu źródłowego C, * .html dla stron internetowych itp. Z Tanenbaum:

W niektórych systemach (np. UNIX) rozszerzenia plików są tylko konwencjami i nie są wymuszane przez system operacyjny. Plik o nazwie file.txt może być jakimś plikiem tekstowym, ale ta nazwa ma raczej przypominać właścicielowi niż przekazywać rzeczywiste informacje do komputera. Z drugiej strony kompilator C może nalegać, aby pliki, które ma skompilować, kończyć się na .c, i może odmówić ich skompilowania, jeśli tego nie zrobią.

Jeśli plik zostanie zapisany lub zostanie zmieniona jego nazwa bez odpowiedniego rozszerzenia, nadal zachowuje ten sam format dla tego typu pliku. W ten sposób większość menedżerów plików decyduje, za pomocą których aplikacji otwierać pliki i dlaczego bez rozszerzenia większość wyświetli monit „Wybierz program, którego chcesz użyć do otwarcia tego pliku:”.

Wreszcie zmienne środowiskowe są używane do definiowania ustawień ogólnosystemowych i na poziomie użytkownika. Na przykład, zmienna EDITORjest używana do określenia, który tekst, aby otworzyć edytor tekstowy np podczas pracy vim, nanoitp ten sposób procesy wiedzieć, którego edytora otwarte, podobnie jak podczas edycji gitpopełnić wiadomość. W przeciwnym razie masz rację, że musisz określić, której aplikacji użyć. Należy zauważyć, że vimwykrywa typy plików, sprawdzając rozszerzenia i sprawdzając zawartość pliku, jeśli to ustawienie filetype onjest ustawione, a następnie stosuje prawidłowe podświetlanie składni, wcięcia itp. ²

TL; DR

Podsumowując, to aplikacje na poziomie użytkownika określają programy, w których należy otworzyć określony typ pliku, a nie sam system operacyjny.

Roberto Gomez
źródło