In che modo Linux sceglie quale applicazione aprire un file?


38

Se un file indica al sistema operativo il suo formato di file, come fa il sistema operativo a scegliere quale applicazione aprirlo per impostazione predefinita?

In Windows, l'associazione è memorizzata nella tabella del registro?

In che modo Linux sceglie quale applicazione aprire un file?

Usavo molto Nautilus, ma ora passo al terminale. È vero che nel terminale dobbiamo sempre specificare esplicitamente quale applicazione aprire un file? Le impostazioni di quale applicazione per aprire un file di un determinato formato di default appartengono al file manager (ad es. Nautilus), e non è un problema quando viviamo nei terminali?


24
Linux è solo il kernel del sistema operativo. Suppongo che tu intenda il tuo ambiente desktop o il tuo file manager qui. Probabilmente sarà diverso su sistemi operativi Android, ChromeOS, Linux (o non Linux) basati su KDE, Gnome, XFCE ... o altro)
Stéphane Chazelas

probabilmente. Non so quale sia il lavoro. Sto usando Gnome, ma vorrei anche sapere di generale.
Tim

Quindi chiarire l'ambiente operativo e desktop e l'applicazione. Come nautilus in Ubuntu 12.04 con desktop "unity".
Stéphane Chazelas,

(1) Sono sotto Ubuntu 12.04. Il mio desktop Gnome o "Unity"? (2) Usavo molto Nautilus, ma ora passo al terminale. È vero che nel terminale, dobbiamo sempre specificare esplicitamente quale applicazione aprire un file? Le impostazioni di quale applicazione per aprire un file di un determinato formato di default appartengono al file manager (ad es. Nautilus), e non è un problema quando viviamo nei terminali?
Tim

Risposte:


35

Potrebbero esserci diversi meccanismi per gestire queste impostazioni predefinite. Tuttavia, altre risposte tendono a concentrarsi su ambienti desktop completi, ognuno con il proprio meccanismo. Tuttavia, questi non sono sempre installati su un sistema (uso molto OpenBox) e, in questo caso, xdg-openpossono essere utilizzati strumenti come .

Citando Arch Wiki :

xdg-open è uno strumento indipendente dal desktop per la configurazione delle applicazioni predefinite di un utente. Molte applicazioni invocano internamente il comando xdg-open.

In questo momento, sto usando Ubuntu (12.04) ed xdg-openè disponibile. Tuttavia, quando si utilizza un ambiente desktop completo come GNOME, xdg-openfunge da semplice server di inoltro e inoltra le richieste di file al proprio DE, che è quindi libero di gestirlo come vuole (vedere ad esempio altre risposte per GNOME e Nautilus) .

All'interno di un ambiente desktop (ad esempio GNOME, KDE o Xfce), xdg-open passa semplicemente gli argomenti all'applicazione di apertura file di quell'ambiente desktop (rispettivamente gvfs-open, kde-open o exo-open), il che significa che il le associazioni vengono lasciate all'ambiente desktop.

... che ti riporta alle altre risposte in quel caso. Tuttavia, poiché questo è Unix e Linux, e non chiedere a Ubuntu:

Quando non viene rilevato alcun ambiente desktop (ad esempio quando si esegue un gestore finestre autonomo, ad esempio Openbox), xdg-open utilizzerà i propri file di configurazione.

Tutto sommato:

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

Se il primo caso, dovrai configurare xdg-opendirettamente , usando il xdg-mimecomando (che ti permetterà anche di vedere quale applicazione dovrebbe gestire quale file). Nel secondo caso ...

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

... dovrai configurare l'apri file associato al tuo ambiente desktop. In alcuni casi, la configurazione effettuata xdg-mimepuò essere reindirizzata allo strumento di configurazione appropriato nel proprio ambiente.


11
In un mondo ideale, Gnome e KDE userebbero le impostazioni xdg per scegliere quale app aprire un file e fornirebbero le UI per cambiare le opzioni xdg. Quindi potremmo avere un solo database di impostazioni, anziché uno per ogni DE. Purtroppo xdg è apparso troppo tardi.
joeytwiddle,

2
In un mondo ideale, non avresti tre DE.
Russell Borogove,

1
@RussellBorogove - allora dovremmo spostarci tutti su Windows. È un mondo ideale.
don_crissti,

@don_crissti Penso che questo fosse più inteso come "ideale per uno sviluppatore o amministratore". Mentre è una grande cosa offrire varietà a un utente finale, sarebbe davvero molto più facile (ma non necessariamente "migliore") per i progettisti concentrarsi su un singolo sistema. xdg-openè solo uno di questi componenti che cercano di unire le due estremità.
John WH Smith

1
@John - su amministratori e vari sviluppatori / designer di app: d'accordo ... ma poi, gli sviluppatori a monte possono fare solo così tanto. In un mondo ideale, invece di lamentarci di questo o quello, contribuiremmo tutti a progetti a monte come KDE, Gnome, ecc. Per migliorare l'usabilità e l'operatività tra i DE. Se tutti noi (milioni) facessimo solo un piccolo sforzo, tutti questi problemi sarebbero risolti in pochi giorni.
don_crissti,

11

Dalla voce wiki ,

Le GUI basate su Linux, come KDE e GNOME, supportano le associazioni basate sul tipo MIME. Ad esempio, il tipo MIME text / plain verrebbe associato a un editor di testo.

Inoltre, questa risposta ha maggiori dettagli.

Il file manager usa spesso una combinazione delle opzioni aeb (ad esempio, guarda prima l'estensione del file, se non è nota (o il file non ha un'estensione), guarda il contenuto).

Il tipo di un file non viene archiviato come metadati su file system Linux comuni.

Da questa risposta, vedo le informazioni di seguito.

Il file manager (Nautilus, per impostazione predefinita) utilizza il tipo MIME di un file per determinare con quale programma aprirlo. Quando viene installata un'applicazione, può specificare quali tipi MIME può aprire e il comando da utilizzare per aprire i file nel file .desktop che si trova in / usr / share / applicazioni. Questo è il file utilizzato per menu, collegamenti sul desktop, ecc.


1
La mia domanda è "dato il tipo di formato di un file", determina quale applicazione aprire il file.
Tim

11

Un file non dice al sistema operativo il suo formato, con una sola eccezione:

Se un file eseguibile inizia con una cosiddetta linea shebang, come

#! /usr/bin/perl

quindi questa riga dice al kernel Linux che dovrebbe essere avviato /usr/bin/perl(ovvero, invece di eseguire questo file, dovrebbe essere eseguito usr/bin/perle fornire questo file come argomento). Questo ovviamente funziona solo con formati di file che ignorano (o comprendono) una tale linea shebang.

A parte questo, il sistema operativo in quanto tale non sa nulla sui tipi di file. Tuttavia, molti programmi che consentono l'apertura di altri file hanno il proprio meccanismo per decidere quale programma utilizzare per aprire quale file. Questo può essere un elenco all'interno del programma stesso (ad esempio Firefox mantiene tale elenco) oppure il programma può delegarlo all'ambiente desktop (di cui ce ne sono diversi per Linux).

Di solito, questi meccanismi considerano solo il nome del file per decidere di che tipo è il file; un'eccezione sono i client di posta elettronica e i browser Web, in cui solitamente il tipo di file viene esplicitamente indicato dal server / indicato nella posta.

Il meccanismo è di solito in due fasi:

  • Innanzitutto, dal nome del file o dalle informazioni fornite, determinare il tipo MIME del file (il tipo MIME è un elenco standardizzato, ma estensibile di tipi di file).
  • In secondo luogo, dal tipo MIME, determinare quale programma eseguire, di solito attraverso una sorta di registro gestito dal programma stesso o dall'ambiente desktop per cui è stato scritto il programma.

Grazie. È vero che nel terminale, dobbiamo sempre specificare esplicitamente quale applicazione aprire un file (tranne lo script con shebang)? Le impostazioni di quale applicazione per aprire un file di un determinato formato per impostazione predefinita appartengono al file manager (ad esempio Nautilus), mentre non è un problema quando viviamo nei terminali?
Tim

Se si desidera utilizzare le associazioni Gnome dalla riga di comando, è possibile utilizzare il comando gnome-open. Sono sicuro che esistono altri strumenti da riga di comando simili per gli altri ambienti desktop. Modifica: noto solo che John WH Smith dà un comando indipendente dall'ambiente desktop.
Celtschk,

6
Correzione : la riga shebang non è un messaggio per il kernel; è un messaggio per la shell .
Kazark,


2
Poiché il collegamento al codice effettivo in quella pagina collegata non sembra funzionare ora, ecco un altro collegamento al codice del kernel che gestisce le linee shebang: lxr.free-electrons.com/source/fs/binfmt_script.c - ovviamente potresti anche basta installare i sorgenti del kernel e guardare nel file.
Celtschk,

4

È fatto in modo simile a MS-Windows.

Non è fatto dal sistema operativo. Viene eseguito dal file manager, una parte del sistema di finestre. Di solito la parte del nome del file dopo l'ultimo punto .viene utilizzata per prendere la decisione. C'è un modo per impostarli nelle impostazioni o quando si fa clic con il tasto destro su un file.

Quindi il file non dice al sistema operativo, il file non è attivo, quindi non può fare nulla da solo, ma il file manager guarda il nome del file, il file manager può anche guardare all'interno del file proprio come fa l' fileutilità.


Probabilmente, in Windows non è fatto dal file manager in sé. Qualsiasi applicazione può chiamare shell32!ShellExecute()e sebbene shell32 faccia parte della shell di Windows, non fa parte di Windows Explorer, che è il file manager predefinito.
Ruslan,

3

Come dice @richard, è simile a Windows. Un gestore di file generico può prima esaminare il nome di un file e provare a riconoscere un'estensione di file associata a un programma. In caso contrario, potrebbe tentare di aprire il file e cercare un'intestazione. Se provi a leggere un file non di testo (ad esempio, un .jpeg), vedrai una stringa di dati che descrive il file. Ad esempio, questa è la prima riga di un .jpeg che avevo in giro:

'\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'


2
Alcuni gestori di file analizzano il contenuto del file prima dell'estensione del file (forse ignorano sempre l'estensione, non sono sicuro). Ad esempio in Dolphin di KDE se hai immagini GIF associate a un browser e PNG con visualizzatore di immagini, rinominando il file.pngfile PNG in file.gifsi aprirà comunque il visualizzatore di immagini. E se svuoti il ​​file, questo si aprirà nell'editor di testo.
Ruslan,

3

Cercherò di dare una risposta di fondo su come i sistemi Unix gestiscono i file. Come altri hanno sottolineato, la tua formulazione della domanda è fuorviante poiché i file stessi non riportano che tipo sono e il kernel stesso non decide quali applicazioni usare.

Nei sistemi operativi Unix e Windows, i file sono strutturati semplicemente come una sequenza di byte. Dai sistemi operativi di Tanenbaum , terza edizione:

In effetti, il sistema operativo non sa o si preoccupa di cosa c'è nel file. Tutto ciò che vede sono byte. Qualsiasi significato deve essere imposto da programmi a livello di utente.

Ecco perché, in un ambiente desktop, xdg-open viene utilizzato per determinare le applicazioni predefinite per l'apertura di tipi di file specifici.

Su un sistema Unix, i file sono differenziati tra file normali e file speciali . Un file normale è semplicemente un dato utente che può essere un file di testo (codifica ASCII o Unicode) o binario (codice eseguibile). I file speciali sono file essenziali per l'esecuzione del sistema operativo. Questi includono directory, collegamenti, pipe, socket e file di dispositivo.¹

È per convenzione che i nomi dei file contengono estensioni per indicare quale tipo di file potrebbero essere ad es. * .C per il codice sorgente C, * .html per le pagine Web, ecc. Da Tanenbaum:

In alcuni sistemi (ad es. UNIX), le estensioni dei file sono solo convenzioni e non sono applicate dal sistema operativo. Un file chiamato file.txt potrebbe essere una sorta di file di testo, ma quel nome è più un promemoria per il proprietario che per trasmettere qualsiasi informazione effettiva al computer. D'altra parte, un compilatore C può effettivamente insistere sul fatto che i file che devono essere compilati finiscono in .c, e può rifiutarsi di compilarli se non lo fanno.

Se un file viene salvato o rinominato senza l'estensione corretta, mantiene comunque lo stesso formato per quel tipo di file. Questo è il modo in cui la maggior parte dei file manager decide con quali applicazioni aprire i file e perché senza l'estensione più richiederà all'utente "Scegli il programma che desideri utilizzare per aprire questo file:".

Infine, le variabili di ambiente vengono utilizzate per definire le impostazioni a livello di sistema e a livello di utente. Ad esempio, la variabile EDITORviene utilizzata per specificare quale editor di testo aprire durante la gestione del testo vim, ad es . nano, Ecc. Ecco come i processi sanno quale editor aprire, come quando si modifica un gitmessaggio di commit. Altrimenti, hai ragione a specificare quale applicazione utilizzare. Si noti che vimrileva i tipi di file controllando le estensioni e controllando il contenuto del file, se l'impostazione filetype onè impostata, che applica quindi l'evidenziazione della sintassi, il rientro, ecc. ² corretti

TL; DR

In breve, sono le applicazioni a livello di utente che determinano con quali programmi aprire un determinato tipo di file e non il sistema operativo stesso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.