Commande vs programme?

19

Je cherchais la différence entre adduseret useradd, et une explication est que useraddc'est une commande while adduserest un script perl. Je comprends ce qu'est un script Perl, mais ce que je ne comprends pas, c'est ce qu'est commandalors exactement.

J'ai toujours pensé que les commandes aiment ls, ln, cdetc sont tous des programmes simples écrits dans la langue que tout simplement faire une chose. Quelle est la différence entre ces "programmes simples" et un script perl?

Je sais bien sûr qu'un script (perl) n'est pas compilé mais interprété au moment de l'exécution, mais je suppose que ce n'est pas la seule différence?

kramer65
la source
1
ne vous concentrez pas trop sur compilé vs interprété dans ce cas. vous pourriez avoir un shell interprété (bien que la raison pour laquelle vous en voudriez un soit discutable). concentrez-vous plutôt sur le fait que le code d'une action de commande est une partie statique du code source du shell, alors qu'un script est externe, ne doit pas être supposé exister, ou se comporter exactement de la même manière sur deux systèmes légèrement différents, et peut même pas nécessairement toutes ses dépendances remplies. les scripts sont plus flexibles, et pour cette raison, moins fiables en général, alors qu'une commande fonctionnera partout où le shell le fera.
Frank Thomas
En termes simples: la commande est tout ce qui peut s'exécuter tandis que le programme est un binaire qui peut s'exécuter.
Pithikos

Réponses:

32

En termes simples, une commande est une instruction (ou un ensemble d'instructions) à exécuter par un ordinateur.

Commandes autonomes

Utilitaires Unix fondamentaux tels que ls, ln, etc. sont (généralement) en C et compilé pour être exécutables autonomes des programmes qui ne nécessitent pas un interprète à exécuter; ils nécessitent généralement l' installation de certains fichiers de bibliothèque sur le système, mais c'est une réponse à une autre question.

Scripts

Un script est une collection de commandes et en fait, les scripts eux-mêmes sont considérés comme une commande.

Un script Perl est une séquence d'instructions Perl et nécessite un perlexécutable (autonome et compilé) programme pour interpréter les instructions Perl.

Parfois, des scripts interprétatifs volumineux et complexes (dans des langages tels que Perl, Python et Ruby) sont également appelés programmes interprétés tandis que le terme script est réservé à des scripts plus courts et plus simples.

Un script shell est une séquence d'autres commandes (tout type de commande) et il nécessite un shell Unix tel que Bash pour interpréter le script. Depuis la page de manuel de Bash:

Bash est un interpréteur de langage de commande compatible sh qui exécute les commandes lues à partir de l'entrée standard ou d'un fichier.

Coques intégrées

Les shells ont généralement des commandes intégrées qui ne sont ni des programmes autonomes ni des scripts. Au lieu de cela, ils font partie du shell lui-même et sont exécutés directement par le shell. cdest un exemple d'une telle commande intégrée.

Parfois, il existe des commandes qui existent en tant que commandes intégrées au shell et en tant que commandes autonomes en même temps, par exemple, la echocommande.

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

echo exécute de lui-même le shell intégré tandis que la commande autonome peut être exécutée en fournissant son chemin complet.

Exécutez la version intégrée d'écho:

$ echo --version
--version

Exécutez un echoprogramme autonome :

$ /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.

Remarque: Les détails ci-dessus se réfèrent à un environnement Unix mais les mêmes principes s'appliquent à un environnement Windows.

Anthony G - justice pour Monica
la source
L'écho auquel vous faites référence dans Windows ne se produit que si vous installez Cygwin. Vous ne trouverez pas echo. * Dans Windows car il s'agit purement d'une commande shell CMD (echo dans powershell est aliasé en écriture-objet)
Jim B
@JimB C'est vrai. J'ai édité la dernière ligne pour clarifier ce que je voulais dire. Par coïncidence, je viens juste de commencer à apprendre PowerShell cette semaine (heureusement, je n'ai pas eu à travailler avec des .batfichiers depuis de très nombreuses années).
Anthony G - justice pour Monica
2

Une commande intégrée fait partie du shell. Un programme est exécuté par le shell.

Les commandes intégrées sont contenues dans le shell lui-même. Lorsque le nom d'une commande intégrée est utilisé comme premier mot d'une commande simple (voir Commandes simples ), le shell exécute la commande directement, sans appeler un autre programme. Les commandes intégrées sont nécessaires pour implémenter des fonctionnalités impossibles ou peu pratiques à obtenir avec des utilitaires distincts.

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

Steven
la source
Mais ce useraddn'est pas un shell intégré. Le site Web vient de dire "commande", pas "commande intégrée". En quoi cette explication est-elle pertinente pour cette question?
Barmar
1

Commande signifie simplement un moyen de dire à une application ou à un système de faire quelque chose.

Une application accepte généralement de nombreuses commandes différentes, soit à partir de l'interface graphique, soit à partir de stdin, mais d'autres méthodes sont possibles, par exemple un socket UNIX ou un canal nommé, une sorte d'API Web, une connexion RPC ou un autre protocole personnalisé.

Une application qui ne fait qu'une seule chose, puis se ferme, généralement sans interface graphique, peut également être appelée une commande, car vous ne pouvez vraiment "donner" à cette application qu'une "commande" significative. " C'est ainsi que les petits programmes comme lset tels fonctionnent et pourquoi ils sont appelés commandes.

Mais vous n'appeleriez pas Photoshop une commande, mais vous émettriez certainement des commandes à l'intérieur via l'interface graphique.

Cependant, le terme peut signifier différentes choses pour différentes personnes. Dans votre exemple, la commande est utilisée pour décrire un exécutable exécuté directement, par opposition à un fichier qui nécessite un interpréteur de script pour fonctionner. La distinction peut être importante car lorsque vous exécutez un script Perl, /usr/bin/perlc'est le binaire qui s'exécute réellement (donc si vous voulez tuer un script Perl de longue durée, c'est ce que vous devez rechercher dans ps). Cependant, la plupart des shells ont des commandes "intégrées" qui sont des commandes au shell lui-même et ne provoquent pas l'exécution d'un exécutable externe. Par exemple, cdest géré par bashlui-même et n'appelle pas /sbin/cdou similaire.

LawrenceC
la source
Perspective intéressante. Au niveau de l'abstraction à partir de laquelle vous regardez cela, je suis tenté d'appeler cela une «invocation» ou un «geste» ou même d'aller avec la terminologie Android comme une «intention». Cela dit, je ne sais pas si j'aime l'idée de faire un critère compilé vs interprété. Powershell, par exemple, est interprété de manière hybride (, Net), mais en tant que shell, il a des commandes dans sa base de code. mais alors vous faites un bon point sur les exécutables compilés externes (code machine) qui sont différents des scripts, mais aussi des commandes. comme je l'ai dit, perspective intéressante.
Frank Thomas