Führen Programme in ihrer einfachsten Form nur Terminalbefehle aus?

18

Nehmen wir zum Beispiel an, ich kann in einem Programm einen Ordner auswählen und an einen anderen Speicherort kopieren. Auf einer sehr grundlegenden Ebene führt diese Anwendung Befehle aus, die ich im Terminal ausführen kann, oder verwendet sie eine interne OS-API, um diesen Schritt auszuführen?

Bitte ersparen Sie mir bösartige Antworten. Ich bin nur neugierig und mir dessen voll bewusst, dass dies als eine Frage angesehen werden kann, die sich ein 13-Jähriger stellen würde.

azz0r
quelle
4
Willkommen bei Ask Different! Einige Fragen sind weiter fortgeschritten als andere, und das ist in Ordnung. du musst dich nicht entschuldigen. Wenn Sie eine Frage zu Apple-Hardware, Apple-Software, anderen Apple-Produkten oder -Diensten, Hardware und Software von Drittanbietern für Apple-Produkte haben und keine in den häufig gestellten Fragen untersagten Themen behandelt werden, sind Sie an der richtigen Stelle, um Ihre Frage zu stellen ! Also , wenn Ihre Frage-Thema ist, dann ist es hier willkommen, auch wenn Sie sind ein 13-jährige (aber nicht jünger, gemäß den Nutzungsbedingungen ).
Daniel
3
Tolle Frage - es gibt mindestens drei nicht triviale Antwortebenen auf diese Frage. Ich hoffe, dass dies eine grundlegende Antwort, eine mittlere, und eine Antwort auf der Ebene "John Siracusa zerlegt das Innenleben der Binärstruktur der Mac OS X-Anwendung", damit Sie auswählen und von allen lernen können.
bmike

Antworten:

11

Konzeptionell wird immer die OS-API verwendet - die Frage ist nur, auf welche Weise. Grundsätzlich gibt es drei Möglichkeiten.

  1. Verwendung von Low-Level-OS-API (Systemaufrufe) direkt. In Ihrem Beispiel ist die Aufgabe ziemlich kompliziert: Holen Sie sich die Liste der Elemente im Ordner, überprüfen Sie den Typ (Ordner, Datei ...), erstellen Sie für jedes Element das entsprechende Element im Zielordner, für Dateien lesen Sie den Inhalt aus der Quelle, in die Zieldatei schreiben usw. Da die Aufgabe so komplex ist, ist es leicht, etwas falsch zu machen, so dass die meisten Anwendungen dies vermeiden.

  2. Verwenden Sie eine Bibliothek (API), die die Aufgabe vereinfacht. Zum Beispiel bietet das Apple Cocoa Framework der NSFileManagerKlasse die copyItemAtPath:toPath:errorMethode, mit der alle Dirty-Work-Vorgänge mit der Low-Level-OS-API ausgeführt werden. Die Anwendung muss also keine Low-Level-API selbst verwenden, sondern kann sich auf etwas verlassen, das immer weniger Arbeit erfordert im System vorhanden. Auch Apple dürfte dafür sorgen, dass es gut funktioniert.

  3. Verwenden Sie einen externen Prozess, um die Aufgabe zu erledigen. In diesem Fall verwendet der externe Prozess eine der beiden oben genannten Methoden, um die Arbeit zu erledigen. Die Anwendung muss einen solchen Prozess starten, ihn überwachen und warten, bis er abgeschlossen ist. Es ist wahrscheinlich, dass ein solcher Prozess als Befehlszeilentool ausgeführt werden kann. Dies ist also wahrscheinlich ein Befehl, den Sie in Terminal ausführen können. Es ist nicht garantiert, aber sehr gut möglich.

Die meisten Anwendungen verwenden Option 2., da diese einfacher als 1. und sicherer und effizienter als 3. ist. Um einen externen Prozess auszuführen, müssen Sie ihn ordnungsgemäß einrichten und haben keine Kontrolle darüber, was er tut. Zum Beispiel ist es viel schwieriger herauszufinden, was genau im Fehlerfall passiert ist, und es ist schwer zu wissen, was es tut (z. B. Fortschritt anzeigen). Aus diesem Grund entscheiden sich Entwickler in den meisten Fällen wahrscheinlich für Option 2, es gibt jedoch keine Garantie. Ein bemerkenswertes Beispiel sind Anwendungen, die Shell-Skripte zum Anpassen verwenden, z. B. Installationsprogramme.

Hinweis für fortgeschrittene Benutzer: Sie können die Funktion dtracevon OS X verwenden, um herauszufinden, was eine bestimmte Anwendung tut. Sie können beispielsweise alle Prozesse überprüfen, die gerade gestartet werden, damit Sie sehen, welche Tools verwendet werden (siehe execsnoop).

Simon Urbanek
quelle
4

Ich fürchte, die Antwort ist "es kommt darauf an, aber normalerweise ist es die zweite." Selbst wenn ein GUI-Programm Terminalbefehle ausführt, werden diese durch Aufrufen einer API ausgeführt.

Ein Programm, bei dem es sich lediglich um eine Liste von Terminalbefehlen handelt, wird als Shell-Skript bezeichnet. Solche Programme können unter Mac OS X ausgeführt werden, müssen jedoch entweder in einem Terminalfenster ausgeführt werden oder ein Programm starten, das die GUI verwendet, wenn Sie die Ausgabe sehen möchten. Andere Programme können Befehlszeilenprogramme über interne APIs aufrufen.

Während die meisten Entwicklungsfragen für diese Site nicht zum Thema gehören, wird bei einem Beispiel, das tatsächlich zum Thema gehört, Automator ausgeführt.

Eine Option in der Liste der internen Befehle, die ein in Automator erstelltes Programm aufrufen kann, ist die Möglichkeit, ein Shell-Skript oder eine Liste der Terminal-Befehle aufzurufen. Dies ist jedoch nur eine von vielen Optionen, die in der internen API zur Verfügung stehen.

Bildbeschreibung hier eingeben

Daniel
quelle
Manchmal rufen die APIs jedoch Befehle auf, auf die Sie über Terminal zugreifen können. Ich habe Berichte gelesen (nichts, was ich auf meinem eigenen Computer replizieren möchte, vielen Dank), dass /sbin/shutdownder Befehl "Herunterfahren" im Apple-Menü nicht mehr funktioniert , wenn er beschädigt oder gelöscht wird.
Daniel
1
Shell-Skripte müssen nicht in einem Terminalfenster oder einer anderen Windows-Oberfläche ausgeführt werden. Wenn sie jedoch eine Ausgabe erzeugen, die nicht in eine Datei umgeleitet wird, können Sie diese in einem Fenster ausführen. Shell-Skripte können auch andere Programme mit Windows ausführen.
ctrl-alt-delor
@ Richard Absolut richtig. Bearbeitet
Daniel
2

Eine der großartigen Ideen hinter Unix ist (war), dass, wenn Sie eine Idee für ein Programm haben, Sie es zuerst als Shell-Skript schreiben würden - im Wesentlichen eine Reihe von Befehlen aufrufen.

Wenn sich das Programm dann als nützlich erwiesen hat, können Sie die Benutzeroberfläche verbessern, Benutzer es testen lassen und schließlich, wenn Sie überzeugt sind, dass es sich gelohnt hat, ein "echtes" Programm schreiben.

Dies war natürlich vor der Übernahme der grafischen Benutzeroberflächen der Fall, sodass ein "Programm" hier ein CLI-Befehl für sich ist.

Sie sehen diesen Ansatz immer noch in einigen modernen Programmen, insbesondere wenn sie Systeminformationen anzeigen. Möchten Sie eine einfache App erstellen, um alle Dateien in einem Ordner aufzulisten? Einfach ausführen ls -al, das Ergebnis analysieren und eine Tabelle anzeigen. Viel Spaß mit den verschiedenen Parametern und Sie haben Ihr Material für die Version 2.0

Monolo
quelle
1

Eine Klasse von Programmen, die Terminalbefehle ausführen (obwohl alles mit einem API-Aufruf beginnt), sind die integrierten Programmentwicklungsumgebungen wie Eclipse oder Xcode. Die Sammlung von Werkzeugen, die für die Programmentwicklung erforderlich sind, ist unerschwinglich groß, um in einer IDE enthalten zu sein und für diese gewartet zu werden. Stattdessen erstellt es ein Makefile (eine Art Skript) und führt es mit dem Unix-Befehl 'make' (oder einem Äquivalent) aus, um die Schritte zum Kompilieren, Verknüpfen, Laden und Debuggen auszuführen. Make führt wiederum den Compiler, den Linker usw. über die Befehlszeilenschnittstellen aus. Dadurch ist die IDE relativ unabhängig von dem vom Programmierer ausgewählten Tool-Set und unempfindlich gegenüber Updates der Tools.

JRobert
quelle
1

Anwendungen können CLI-Befehle ausführen, um eine bestimmte Aufgabe auszuführen, und einige tun dies tatsächlich. Aufgrund von Effizienzproblemen vermeiden professionelle Anwendungsentwickler jedoch die Ausführung des Befehls und verwenden stattdessen die APIs , die der Befehl zur Ausführung der erforderlichen Aufgabe verwendet.

ismail
quelle
Ich bin ein professioneller Softwareentwickler. Ich rufe Befehle aus meinen Programmen auf. Ich werde sogar einige oder alle von ihnen selbst schreiben und dann die GUI in einer anderen Sprache schreiben. Ich würde jedoch nicht die Befehle cp (Kopieren) oder mv (Verschieben / Umbenennen) verwenden, da die API zum Kopieren oder Umbenennen einfach ist. Einige Freie-Software-Projekte verwenden diese Technik. Einige erwarten, dass sie ein exzellentes, aber schwer zu verwendendes Kommandozeilen-Tool geschrieben haben (z. B. um ein ISO-CD-Image zu erstellen und ein Image auf eine CD zu schreiben). Der GUI-Experte schreibt eine GUI, die beide Tools verwendet , um sie in Gang zu setzen und den Fortschritt zu überwachen.
ctrl-alt-delor
Ich habe API nur als einfaches Wort verwendet, das die Frage verwendete. Tatsächlich habe ich die Antwort jedes Mal mehrmals neu geschrieben, um sie einem weniger vertrauten Publikum mit den grundlegenden Code- und Namenskonventionen von API vs libs vs Frameworks usw. zugänglich zu machen andere professionelle Software-Ingenieur. Wenn Sie in meinem Post etwas bearbeiten möchten, das die Angelegenheit weiter klären würde, gehen Sie bitte vor und tun Sie dies.
Ismail
Es gibt keine Beleidigung, ich kläre nur. Ein guter Programmierer wird oder wird keine Befehlszeilenprogramme aufrufen. Die Entscheidung basiert auf der Komplexität und möglicherweise (nach dem Messen der Geschwindigkeit) auf der Effizienz. Für die kleine Gruppe von Fachleuten, die auf dem Markt verkaufen, besteht möglicherweise die Notwendigkeit, Ihr Programm komplexer zu gestalten. Das Aufrufen eines Kommandozeilenprogramms kann einfach zu einfach erscheinen. Daher ist ein Umschreiben erforderlich. Wenn Sie Provisionen oder Freie Software machen, dann machen Sie das Einfachste, was funktioniert.
Strg-Alt-Delor