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 un livello molto semplice è l'applicazione che esegue i comandi che potrei eseguire nel terminale o sta usando alcune API del sistema operativo interno per fare questo spostamento?

Per favore, risparmiami qualsiasi risposta crudele; Sono solo curioso e totalmente consapevole che può essere percepito come una domanda che un tredicenne potrebbe porre.


4
Benvenuti a chiedere diverso! Alcune domande sono più avanzate di altre, e va bene; non devi scusarti. Se hai una domanda su hardware Apple, software Apple, altri prodotti o servizi Apple, hardware e software di terze parti per prodotti Apple e non si tratta di argomenti proibiti nelle FAQ, allora sei nel posto giusto per porre la tua domanda ! Quindi, se la vostra domanda è in argomento, è il benvenuto qui, anche se sei un 13-year-old (ma non più giovane, secondo i termini di servizio ).
Daniel

3
Grande domanda: ci sono almeno tre livelli non banali di risposte a questa domanda. Spero che questa ottenga una risposta di base, una centrale, e una risposta di livello "John Siracusa analizza il funzionamento interno della struttura binaria dell'applicazione Mac OS X" in modo da poter scegliere e imparare da tutti.
bmike

Risposte:


11

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

  1. utilizzando direttamente l'API del sistema operativo di basso livello (chiamate di sistema). Nel tuo esempio l'attività è piuttosto complessa: 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 nel file di destinazione ecc. Dato che l'attività è così complessa, è facile sbagliare qualcosa, quindi la maggior parte delle applicazioni lo eviterà.

  2. utilizzare una libreria (API) che semplifica l'attività. Ad esempio, il framework Apple Cocoa fornisce NSFileManagerclasse con il copyItemAtPath:toPath:errormetodo che fa tutto il lavoro sporco utilizzando API del sistema operativo di basso livello, quindi l'applicazione non deve utilizzare 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. utilizzare un processo esterno per eseguire l'attività. 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 al termine. È probabile che tale processo possa essere eseguito come uno strumento da riga di comando, quindi questo sarebbe probabilmente un comando che puoi eseguire nel 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 guasto ed è difficile sapere cosa sta facendo (ad es. Mostrare progressi). Questo è il motivo per cui nella maggior parte dei casi gli sviluppatori sceglieranno probabilmente l'opzione 2, ma non esiste alcuna garanzia. Un esempio notevole sono le applicazioni che utilizzano script di shell per la personalizzazione, come i programmi di installazione.

Nota per utenti avanzati: è possibile utilizzare la dtracefunzione di OS X per scoprire cosa sta facendo una particolare applicazione. Ad esempio, puoi controllare tutti i processi che sta generando in modo da vedere gli strumenti che sta usando (vedi execsnoop).


4

Temo che la risposta sia "dipende, ma di solito il secondo". In realtà, anche se un programma GUI esegue comandi terminal, 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 Terminale o avviare un programma che utilizza la GUI se si desidera vedere il loro output. Altri programmi possono chiamare i programmi della riga di comando tramite API interne.

Mentre la maggior parte delle domande di sviluppo sono fuori tema per questo sito, un esempio che è effettivamente in argomento riguarda l'esecuzione di Automator.

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

inserisci qui la descrizione dell'immagine


Ma a volte le API finiscono per chiamare comandi a cui puoi accedere dal Terminale. Ho letto i resoconti (nulla che mi interessa replicare sul mio computer, grazie mille) che se /sbin/shutdownviene danneggiato o cancellato, il comando Shutdown nel menu Apple smette di funzionare.
Daniel

1
Gli script della shell non devono essere eseguiti in una finestra del terminale o in qualsiasi altra finestra software. Ma se producono output che non viene reindirizzato a un file, è possibile scegliere di eseguirlo in una finestra. Gli script di shell possono anche eseguire altri programmi che hanno Windows.
ctrl-alt-delor

@richard Assolutamente giusto. Modificato.
Daniel

2

Una delle grandi idee alla base di Unix è (era) che se si avesse un'idea per un programma, lo si scriverebbe prima come uno script di shell - essenzialmente chiamando una serie di comandi.

Quindi, se il programma si rivelasse utile, potresti migliorare la sua interfaccia, chiedere agli utenti di testarlo e, infine, quando eri convinto che ne valesse la pena, scrivi un programma "reale".

Questo, ovviamente, era prima che le interfacce grafiche degli utenti prendessero il sopravvento, quindi un "programma" qui è un comando CLI in sé.

Vedi 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? Basta eseguire ls -al, analizzare il risultato e mostrargli una tabella. Divertiti con i vari parametri e hai il tuo materiale per la versione 2.0


1

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


1

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


Sono un ingegnere informatico professionista. Chiamo comandi dai miei programmi. Scriverò anche alcuni o tutti loro da solo, quindi scriverò la GUI in una lingua diversa. Non vorrei tuttavia utilizzare i comandi cp (copia) o mv (sposta / rinomina) poiché l'API per copiare o rinominare è semplice. Alcuni progetti di software libero usano questa tecnica. Alcuni si aspettano di aver scritto degli strumenti da riga di comando eccellenti ma difficili da usare (ad es. Per creare un'immagine iso cd e per scrivere un'immagine su cd) l'esperto di gui scrive una gui che utilizza entrambi questi strumenti, consentendo sostanzialmente all'utente di configurare gli strumenti , per farli funzionare e monitorare i progressi.
ctrl-alt-delor,

Ho usato l' API come semplice parola usata dalla domanda. In realtà, ho riscritto più volte la risposta ogni volta rendendola per il pubblico meno familiare con il codice di under-lay e le convenzioni di denominazione di API vs libs vs Frameworks ecc. Non intendevo offendere né te né la tua professione @richrad, né alcuno altro ingegnere informatico professionista. Se c'è qualcosa che vuoi modificare nel mio post che chiarirebbe ulteriormente la questione, vai avanti e fallo.
Ismail,

Non c'è offesa, sto solo chiarendo. Un buon programmatore chiamerà o non chiamerà i programmi della riga di comando, la decisione sarà basata sulla complessità e possibilmente (dopo aver misurato la velocità) sull'efficienza. Per il piccolo gruppo di professionisti che vendono al mercato, potrebbe essere necessario rendere complesso il programma; Chiamare un programma da riga di comando, può sembrare semplice. Pertanto è necessaria una riscrittura. Se fai commissioni o software libero, fai la cosa più semplice che funziona.
ctrl-alt-delor,
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.