Digamos, por ejemplo, en un programa que me permite seleccionar una carpeta y copiarla en otra ubicación, en un nivel muy básico, ¿esa aplicación ejecuta comandos que podría ejecutar en la terminal o está usando alguna API interna del sistema operativo para hacer ese movimiento?
Por favor, perdóname cualquier respuesta viciosa; Tengo curiosidad y estoy totalmente consciente de que puede percibirse como una pregunta que haría un niño de 13 años.
Respuestas:
Conceptualmente, siempre usa la API del sistema operativo: la pregunta es solo de qué manera. Hay esencialmente tres opciones.
utilizando la API del sistema operativo de bajo nivel (llamadas al sistema) directamente. En su ejemplo, la tarea es bastante complicada: obtenga la lista de elementos en la carpeta, verifique el tipo (carpeta, archivo ...), para cada uno de ellos cree el elemento correspondiente en la carpeta de destino, para que los archivos lean el contenido del fuente, escribir en el archivo de destino, etc. Dado que la tarea es tan compleja, es fácil equivocarse, por lo que la mayoría de las aplicaciones lo evitarán.
use una biblioteca (API) que simplifique la tarea. Por ejemplo, el marco Apple Cocoa proporciona a la
NSFileManager
clase elcopyItemAtPath:toPath:error
método que hace todo el trabajo sucio usando la API del sistema operativo de bajo nivel, por lo que la aplicación no necesita usar la API de bajo nivel en sí misma, pero puede confiar en algo que requiere menos trabajo y siempre es presente en el sistema. También es probable que Apple se asegure de que funcione bien.use un proceso externo para hacer la tarea. En este caso, el proceso externo utilizará uno de los dos métodos anteriores para hacer el trabajo. La aplicación tiene que iniciar dicho proceso, monitorearlo y esperar hasta que termine. Es probable que dicho proceso pueda ejecutarse como una herramienta de línea de comandos, por lo que probablemente sea un comando que puede ejecutar en la Terminal. No está garantizado, pero es muy posible.
La mayoría de las aplicaciones utilizarán la opción 2. porque es más simple que 1. y más seguro y eficiente que 3. Para ejecutar un proceso externo, debe configurarlo correctamente y no tiene control sobre lo que hace. Por ejemplo, es mucho más difícil averiguar qué salió exactamente en caso de falla y es difícil saber qué está haciendo (por ejemplo, mostrar progreso). Es por eso que en la mayoría de los casos los desarrolladores probablemente elegirán la opción 2, pero no hay garantía. Un ejemplo notable son las aplicaciones que utilizan scripts de shell para la personalización, como los instaladores.
Nota de usuario avanzada: puede usar la
dtrace
instalación de OS X para averiguar qué está haciendo una aplicación en particular. Por ejemplo, puede verificar cualquier proceso que esté generando para ver las herramientas que está utilizando (verexecsnoop
).fuente
Me temo que la respuesta es "depende, pero generalmente la segunda". En realidad, incluso si un programa GUI ejecuta comandos de terminal, los ejecuta llamando a una API.
Un programa que es simplemente una lista de comandos de terminal se denomina script de shell. Dichos programas pueden ejecutarse en Mac OS X, pero tienen que ejecutarse en una ventana de Terminal o iniciar un programa que use la GUI si desea ver su salida. Otros programas pueden llamar a programas de línea de comandos a través de API internas.
Si bien la mayoría de las preguntas de desarrollo están fuera de tema para este sitio, un ejemplo que en realidad es sobre el tema implica ejecutar Automator.
Una opción dentro de la lista de comandos internos que puede llamar un programa creado en Automator es la capacidad de llamar a un script de shell o una lista de comandos de Terminal. Pero esa es solo una de las muchas opciones disponibles dentro de su API interna.
fuente
/sbin/shutdown
está dañado o eliminado, el comando de apagado en el menú de Apple deja de funcionar.Una de las grandes ideas detrás de Unix es (era) que si tuviera una idea para un programa, primero lo escribiría como un script de shell, esencialmente llamando a una serie de comandos.
Luego, si el programa demostró ser útil, puede mejorar su interfaz, hacer que los usuarios lo prueben y, finalmente, cuando esté convencido de que valió la pena, escriba un programa "real".
Esto, por supuesto, fue antes de que las interfaces gráficas de usuario se hicieran cargo, por lo que un "programa" aquí es un comando CLI en sí mismo.
Todavía ve este enfoque en algunos programas modernos, especialmente si muestran información del sistema. ¿Desea crear una aplicación simple para enumerar todos los archivos en una carpeta? Simplemente ejecute
ls -al
, analice el resultado y muéstrele una tabla. Diviértete con los diversos parámetros, y tienes tu material para la versión 2.0fuente
Una clase de programas que ejecutan comandos de terminal (a pesar de que todo comienza con una llamada API) son los entornos integrados de desarrollo de programas como eclipse o Xcode. La colección de herramientas necesarias para el desarrollo del programa es prohibitivamente grande para ser contenida y mantenida para un IDE. En su lugar, crea un archivo MAKE (un tipo de script) y lo ejecuta con 'make' (o un equivalente) de Unix para recorrer el proceso de compilación, enlace, carga y depuración. Make, a su vez, ejecuta el compilador, el enlazador, etc. utilizando sus interfaces de línea de comandos. Esto permite que el IDE sea relativamente independiente del conjunto de herramientas elegido por el programador e insensible a las actualizaciones de las herramientas.
fuente
Las aplicaciones pueden ejecutar comandos CLI para realizar una determinada tarea, y algunas realmente lo hacen; pero debido a problemas de eficiencia, los desarrolladores de aplicaciones profesionales evitan ejecutar el comando y prefieren utilizar las API que utiliza el comando para realizar la tarea requerida.
fuente