Nella loro forma più semplice, i programmi eseguono solo i comandi del terminale?

18

Ad esempio, in un programma, mi consente di selezionare una cartella e copiarla in un'altra posizione, a livello di base l'applicazione che esegue i comandi che potrei eseguire nel terminale o utilizza alcune API del sistema operativo interno per eseguire questa operazione ?

Per favore, risparmia ogni risposta viziosa; Sono solo curioso e totalmente consapevole che possa essere percepito come una domanda che un tredicenne potrebbe chiedere.

    
posta azz0r 18.02.2012 - 13:08
fonte

5 risposte

11

Concettualmente, utilizza sempre l'API del sistema operativo - la domanda è solo in che modo. Ci sono essenzialmente tre opzioni.

  1. utilizzando direttamente API SO di basso livello (chiamate di sistema). Nel tuo esempio l'attività è abbastanza impegnativa: ottieni l'elenco degli elementi nella cartella, controlla il tipo (cartella, file ...), per ognuno di essi crea l'elemento corrispondente nella cartella di destinazione, per i file leggi il contenuto dal fonte, scrivere sul file di destinazione ecc. Poiché l'attività è così complessa, è facile ottenere qualcosa di sbagliato, quindi molte applicazioni lo eviteranno.

  2. usa una libreria (API) che semplifica l'attività. Ad esempio, il framework Apple Cocoa fornisce la classe NSFileManager con il metodo copyItemAtPath:toPath:error che fa tutto il lavoro sporco usando l'API SO di basso livello, quindi l'applicazione non ha bisogno di usare l'API di basso livello stessa ma può fare affidamento su qualcosa che richiede meno lavoro ed è sempre presente nel sistema. Inoltre, è probabile che Apple si assicuri che funzioni bene.

  3. usa un processo esterno per eseguire l'operazione. In questo caso il processo esterno utilizzerà uno dei due metodi sopra indicati per eseguire il lavoro. L'applicazione deve avviare tale processo, monitorarlo e attendere fino a quando non viene eseguito. È probabile che tale processo possa essere eseguito come uno strumento a riga di comando, quindi questo probabilmente è un comando che puoi eseguire in Terminale. Non è garantito, ma molto possibile.

La maggior parte delle applicazioni utilizzerà l'opzione 2. perché è più semplice di 1. e più sicura ed efficiente di 3. Per eseguire un processo esterno è necessario configurarlo correttamente e non si ha il controllo su ciò che fa. Ad esempio, è molto più difficile capire cosa è andato esattamente storto in caso di fallimento ed è difficile sapere cosa sta facendo (ad esempio, mostrare i progressi). Questo è il motivo per cui nella maggior parte dei casi gli sviluppatori sceglieranno probabilmente l'opzione 2, ma non c'è alcuna garanzia. Un esempio notevole sono le applicazioni che utilizzano gli script di shell per la personalizzazione, come i programmi di installazione.

Nota utente avanzata: puoi utilizzare la funzione dtrace di OS X per scoprire cosa sta facendo una determinata applicazione. Ad esempio, puoi controllare tutti i processi che sta generando, in modo che tu possa vedere gli strumenti che sta utilizzando (vedi execsnoop ).

    
risposta data 19.02.2012 - 00:22
fonte
4

Ho paura che la risposta sia "dipende, ma di solito il secondo". In realtà, anche se un programma della GUI sta eseguendo i comandi del terminale, li esegue chiamando un'API.

Un programma che è semplicemente un elenco di comandi terminali è chiamato script di shell. Tali programmi possono essere eseguiti in Mac OS X, ma devono essere eseguiti in una finestra di Terminale o avviare un programma che utilizza la GUI se si desidera vedere il loro output. Altri programmi possono richiamare i programmi della riga di comando tramite le API interne.

Mentre la maggior parte delle domande di sviluppo sono fuori tema per questo sito, un esempio che in realtà è on-topic riguarda l'esecuzione di Automator.

Un'opzione all'interno dell'elenco di comandi interni che un programma creato in Automator può chiamare è la possibilità di chiamare uno script di shell o un elenco di comandi Terminal. Ma questa è solo una delle molte opzioni disponibili all'interno della sua API interna.

    
risposta data 18.02.2012 - 13:26
fonte
2

Una delle grandi idee dietro Unix è (era) che se avessi un'idea per un programma, allora dovresti prima scriverlo come uno script di shell, essenzialmente chiamando una serie di comandi.

Quindi, se il programma si dimostrasse utile, potresti migliorare la sua interfaccia, far sì che gli utenti lo testino e, infine, quando ne eri convinto ne valesse la pena, scrivi un programma "reale".

Questo, naturalmente, era prima che le interfacce utente grafiche prendessero il sopravvento, quindi un "programma" qui è un comando CLI di per sé.

Si vede ancora questo approccio in alcuni programmi moderni, specialmente se mostrano informazioni di sistema. Vuoi creare una semplice app per elencare tutti i file in una cartella? Esegui solo ls -al , analizza il risultato e mostralo come tabella. Divertiti con i vari parametri e hai il tuo materiale per la versione 2.0

    
risposta data 18.02.2012 - 17:07
fonte
1

Una classe di programmi che eseguono comandi terminali (anche se tutto inizia con una chiamata API) sono gli ambienti di sviluppo di programmi integrati come eclipse o Xcode. La raccolta di strumenti necessari per lo sviluppo del programma è proibitivamente grande per essere contenuta e mantenuta per un IDE. Invece, costruisce un makefile (una sorta di script) e lo esegue con un unix 'make' (o un equivalente) per scorrere il processo di compilazione, collegamento, caricamento e debug. Crea, a sua volta, esegue il compilatore, il linker, ecc. Usando le loro interfacce della riga di comando. Ciò consente all'IDE di essere relativamente indipendente dal set di strumenti scelto dal programmatore e insensibile agli aggiornamenti degli strumenti.

    
risposta data 18.02.2012 - 23:50
fonte
1

Le applicazioni possono eseguire comandi CLI per eseguire una determinata attività, e alcune effettivamente lo fanno; ma a causa di problemi di efficienza, gli sviluppatori di applicazioni professionali evitano di eseguire il comando e utilizzano piuttosto le API che il comando utilizza per eseguire l'attività richiesta.

    
risposta data 18.02.2012 - 14:48
fonte

Leggi altre domande sui tag