En su forma más simple, ¿los programas solo ejecutan comandos de terminal?

18

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.

azz0r
fuente
44
¡Bienvenido a Ask Different! Algunas preguntas son más avanzadas que otras, y está bien; No necesitas disculparte. Si tiene alguna pregunta sobre el hardware de Apple, el software de Apple, otros productos o servicios de Apple, hardware y software de terceros para productos de Apple, y no se trata de temas prohibidos en las Preguntas frecuentes, entonces está en el lugar correcto para hacer su pregunta ! Entonces, si su pregunta es sobre el tema, es bienvenida aquí, incluso si tiene 13 años (pero no es más joven, según los términos del servicio ).
Daniel
3
Gran pregunta: hay al menos tres niveles no triviales de respuestas a esta pregunta. Espero que esto obtenga una respuesta básica, una respuesta intermedia, y una respuesta de nivel "John Siracusa disecciona el funcionamiento interno de la estructura binaria de la aplicación Mac OS X" para que pueda elegir y aprender de todos.
bmike

Respuestas:

11

Conceptualmente, siempre usa la API del sistema operativo: la pregunta es solo de qué manera. Hay esencialmente tres opciones.

  1. 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.

  2. use una biblioteca (API) que simplifique la tarea. Por ejemplo, el marco Apple Cocoa proporciona a la NSFileManagerclase el copyItemAtPath:toPath:errormé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.

  3. 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 dtraceinstalació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 (ver execsnoop).

Simon Urbanek
fuente
4

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.

ingrese la descripción de la imagen aquí

Daniel
fuente
Pero a veces las API terminan llamando comandos a los que puede acceder desde la Terminal. He leído informes (nada que me importe replicar en mi propia computadora, muchas gracias) de que si /sbin/shutdownestá dañado o eliminado, el comando de apagado en el menú de Apple deja de funcionar.
Daniel
1
Los scripts de shell no tienen que ejecutarse en una ventana de terminal o en cualquier otra ventana de software. Pero si producen resultados que no se redirigen a un archivo, entonces puede elegir ejecutarlo en una ventana. Los scripts de shell también pueden ejecutar otros programas que tienen ventanas.
ctrl-alt-delor
@richard Absolutamente correcto. Editado
Daniel
2

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.0

Monolo
fuente
1

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.

JRobert
fuente
1

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.

ismail
fuente
Soy un ingeniero de software profesional. Llamo comandos de mis programas. Incluso escribiré algunos o todos ellos y luego escribiré la GUI en un idioma diferente. Sin embargo, no usaría los comandos cp (copiar) o mv (mover / renombrar) ya que la API para copiar o renombrar es simple. Algunos proyectos de software libre utilizan esta técnica. Algunos esperan haber escrito una herramienta de línea de comandos excelente pero difícil de usar (por ejemplo, para crear una imagen de iso cd y escribir una imagen en un cd), el experto en gui escribe una gui que usa ambas herramientas, básicamente permitiendo al usuario configurar las herramientas , para ponerlos en marcha y monitorear el progreso.
ctrl-alt-delor
Utilicé API como la simple palabra que utilizó la pregunta. En realidad, he reescrito la respuesta varias veces cada vez, haciéndola para una audiencia menos familiar con código subyacente y convenciones de nomenclatura de API vs libs vs Frameworks, etc. No quise ofenderte a ti ni a tu profesión @richrad, ni a nadie otro ingeniero de software profesional. Si hay algo que desea editar en mi publicación que aclararía aún más el asunto, continúe y hágalo.
ismail
No hay ofensa, solo estoy aclarando. Un buen programador llamará o no llamará a los programas de línea de comando, la decisión se basará en la complejidad y posiblemente (después de medir la velocidad) en la eficiencia. Para el pequeño grupo de profesionales que venden al mercado, puede ser necesario hacer que su programa sea complejo; Llamar a un programa de línea de comandos puede parecer simple. Por lo tanto, se necesita una reescritura. Si haces comisiones o software libre, entonces haces lo más simple que funciona.
ctrl-alt-delor