Comando vs programa?

19

Estaba buscando la diferencia entre addusery useradd, y una explicación es que useraddes un comando mientras que adduseres un script perl. Entiendo lo que es un script perl, pero lo que no entiendo es qué commandes exactamente eso.

Siempre he pensado que los comandos como ls, ln, cdetc, son todos los programas simples escritas en cualquier lenguaje que simplemente hacer una cosa. ¿Cuál es la diferencia entre estos "programas simples" y un script perl?

Por supuesto, sé que un script (perl) no se compila sino que se interpreta en tiempo de ejecución, pero supongo que esa no es la única diferencia.

kramer65
fuente
1
no se centre demasiado en compilado vs interpretado en este caso. podrías tener un shell interpretado (aunque por qué querrías uno es cuestionable). enfóquese en el hecho de que el código para una acción de comandos es una parte estática del código fuente del shell, mientras que un script es externo, no debe suponerse que existe o comportarse exactamente igual en dos sistemas ligeramente diferentes, y puede ni siquiera necesariamente se cumplen todas sus dependencias. los scripts son más flexibles y, por esa razón, menos confiables en general, mientras que un comando funcionará en cualquier lugar donde funcione el shell.
Frank Thomas
En palabras simples: el comando es cualquier cosa que pueda ejecutarse mientras que el programa es un binario que puede ejecutarse.
Pithikos

Respuestas:

32

En términos simples, un comando es una instrucción (o un conjunto de instrucciones) que debe ejecutar una computadora.

Comandos independientes

Las utilidades fundamentales de Unix tales como ls, lnetc. están escritas (generalmente) en C y compiladas para ser programas ejecutables independientes que no requieren la ejecución de un intérprete; Por lo general, requieren la instalación de ciertos archivos de biblioteca en el sistema, pero esa es una respuesta para otra pregunta.

Guiones

Un script es una colección de comandos y, de hecho, los scripts en sí mismos se consideran un comando.

Un script de perl es una secuencia de sentencias Perl y requiere un perl(stand-alone y compilado) ejecutable del programa para interpretar las declaraciones de Perl.

A veces, los guiones interpretativos grandes y complejos (en lenguajes como Perl, Python y Ruby) también se denominan programas interpretados, mientras que el término guión está reservado para guiones más cortos y simples.

Un script de shell es una secuencia de otros comandos (cualquier tipo de comando) y requiere un shell de Unix como Bash para interpretar el script. Desde la página de manual de Bash:

Bash es un intérprete de lenguaje de comandos compatible con sh que ejecuta comandos leídos desde la entrada estándar o desde un archivo.

Shell incorporado

Los shells generalmente tienen comandos integrados que no son ni programas independientes ni scripts. En cambio, son parte del shell y se ejecutan directamente por el shell. cdes un ejemplo de dicho comando incorporado.

Algunas veces hay comandos que existen como funciones integradas de shell y como comandos independientes al mismo tiempo, por ejemplo, el echocomando.

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo

echo por sí solo ejecuta el shell incorporado, mientras que el comando independiente se puede ejecutar proporcionando su ruta completa.

Ejecute la versión integrada de echo:

$ echo --version
--version

Ejecute el echoprograma independiente :

$ /usr/bin/echo --version
echo (GNU coreutils) 8.23
Packaged by Cygwin (8.23-4)
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Nota: Los detalles anteriores se refieren a un entorno Unix, pero los mismos principios se aplican a un entorno Windows.

Anthony G - justicia para Monica
fuente
El eco al que hace referencia en Windows es solo si instala Cygwin. No encontrará echo. * En Windows, ya que es puramente un comando de shell CMD (echo en powershell tiene un alias para escribir objeto)
Jim B
@JimB Eso es cierto. Edité la última línea para aclarar lo que quería decir. Casualmente, recién comencé a aprender PowerShell esta semana (afortunadamente, no he tenido que trabajar con .batarchivos en muchos, muchos años).
Anthony G - justicia para Monica
2

Un comando integrado es parte del shell. Un programa es ejecutado por el shell.

Los comandos incorporados están contenidos dentro del propio shell. Cuando el nombre de un comando incorporado se usa como la primera palabra de un comando simple (vea Comandos simples ), el shell ejecuta el comando directamente, sin invocar otro programa. Los comandos incorporados son necesarios para implementar funcionalidades imposibles o inconvenientes de obtener con utilidades separadas.

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Builtin-Commands

Steven
fuente
Pero useraddno es un shell incorporado. El sitio web acaba de decir "comando", no "comando incorporado". ¿Cómo es relevante esta explicación para esta pregunta?
Barmar
1

Comando solo significa una manera de decirle a una aplicación o sistema que haga algo.

Una aplicación generalmente aceptará muchos comandos diferentes, ya sea desde la GUI, desde stdin, pero son posibles otros métodos, por ejemplo, un socket UNIX o canalización con nombre, algún tipo de API web, una conexión RPC o algún otro protocolo personalizado.

Una aplicación que solo hace una cosa y luego sale, normalmente sin una GUI, también puede llamarse comando, porque en realidad solo puede "dar" a esta aplicación un "comando" significativo. Así es como funcionan los programas pequeños lsy tales y por qué se llaman comandos.

Pero no llamaría a Photoshop un comando, pero ciertamente emitiría comandos dentro de él a través de la GUI.

Sin embargo, el término puede significar cosas diferentes para diferentes personas. En su ejemplo, el comando se usa para describir un ejecutable que se ejecuta directamente, en comparación con un archivo que requiere un intérprete de script para funcionar. La distinción puede ser importante porque cuando está ejecutando un script Perl, /usr/bin/perles el binario que realmente se está ejecutando (así que si desea eliminar un script Perl de ejecución prolongada, eso es lo que debe buscar ps). Sin embargo, la mayoría de los shells tienen comandos "incorporados" que son comandos del propio shell y no hacen que se ejecute un ejecutable externo. Por ejemplo, cdse maneja bashsolo y no llama /sbin/cdo similar.

LawrenceC
fuente
Perspectiva interesante En el nivel de abstracción desde el que está viendo esto, estoy tentado a llamarlo una 'invocación' o un 'gesto' o incluso ir con la terminología de Android como una 'intención'. Dicho esto, no sé si me gusta la idea de hacer un criterio compilado o interpretado. Powershell, por ejemplo, se interpreta de forma híbrida (, Net), pero como shell, tiene comandos dentro de su base de código. pero luego hace un buen punto acerca de que los ejecutables externos compilados (código de máquina) difieren de los scripts, pero también de los comandos. como dije, perspectiva interesante.
Frank Thomas