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.
Antworten:
Konzeptionell wird immer die OS-API verwendet - die Frage ist nur, auf welche Weise. Grundsätzlich gibt es drei Möglichkeiten.
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.
Verwenden Sie eine Bibliothek (API), die die Aufgabe vereinfacht. Zum Beispiel bietet das Apple Cocoa Framework der
NSFileManager
Klasse diecopyItemAtPath:toPath:error
Methode, 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.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
dtrace
von 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 (sieheexecsnoop
).quelle
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.
quelle
/sbin/shutdown
der Befehl "Herunterfahren" im Apple-Menü nicht mehr funktioniert , wenn er beschädigt oder gelöscht wird.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.0quelle
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.
quelle
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.
quelle