Comment dire qu'une commande shell est un programme ou une fonction?

8

Je voudrais savoir si les commandes que nous appelons dans le shell sont des fonctions ou des programmes .

AymenTM
la source
1
Quelle distinction faites-vous entre "petit programme" et "fonction"?
JdeBP
Vous pouvez entrer des commandes dans un programme shell qui vous permettent de programmer le shell pour qu'il fonctionne et de prendre des commandes en utilisant les fonctions avec lesquelles le shell a été programmé pour commander d'autres programmes à partir des fonctions shell.
txtechhelp

Réponses:

15

Ça dépend.

Les commandes peuvent appartenir à plusieurs catégories: prédéfinies, alias, fonctions, exécutables (scripts et binaires dans le chemin de recherche).

Sur la ligne de commande, ceux-ci occupent un seul espace de noms plat qui rend possible la substitution. Il existe de nombreuses façons de distinguer les types de programmes:

$ f () { :; }
$ alias a=cat
$ which f
f ()
{ 
    :
}

Nous savons que fc'est une fonction.

$ which a
alias a='cat'
        /usr/bin/cat

Nous savons que ac'est un alias.

$ which yes
/usr/bin/yes

Nous savons que yesc'est un programme.

$ builtin echo ; echo $?

0

La coque a un echointégré…

$ builtin cat ; echo $?
bash: builtin: cat: not a shell builtin
1

… Mais pas pour cat. S'il existe une fonction intégrée ou un alias mais que vous insistez pour appeler le programme à la place, préfixez la commande avec une barre oblique inverse:

$ builtin true | printf "%d\n" $?
0
$ alias true=false
$ true ; printf "%d\n" $?
1
$ \true ; printf "%d\n" $?
0
phg
la source
3
De plus, une commande qui est un programme dans une implémentation de * nix pourrait bien devenir un shell intégré (= fonction) dans une autre.
jamesqf
1
@jamesqf, oui, le shell a des outils standard intégrés, mais les commandes intégrées ne sont pas les mêmes que les fonctions. Exécuter par exemplesh -c 'type true; f() { echo x; }; type f'
ilkkachu
5
Notez qu'en général, typeest préférable à whichpresque tous les usages. Voir unix.stackexchange.com/q/85249/135943
Wildcard
@ilkkachu: Cela dépend de votre définition de "identique à". Bien sûr, ils sont implémentés différemment, mais pour l'utilisateur ordinaire tapant une commande, ils sont fonctionnellement les mêmes.
jamesqf
1
@jamesqf, même si votre utilisateur ordinaire n'utilise pas (ne sait pas) comment utiliser les fonctions, prétendre qu'elles sont identiques aux fonctions intégrées est tout simplement déroutant.
ilkkachu
4

La définition de a functionrenvoie des valeurs uniques et ne génère rien. Les fonctions shell en particulier peuvent très bien et peuvent avoir une sortie ou d'autres effets secondaires, car la valeur de retour des fonctions est si limitée.

A commandest une instruction donnée par un utilisateur pour dire à un ordinateur de faire quelque chose, par exemple, exécuter un seul programme ou un groupe de programmes liés.

A programest une séquence d'instructions (c'est-à-dire des commandes) qui sont données à un ordinateur et compréhensibles par l'unité centrale de traitement (CPU) de l'ordinateur. ces instructions indiquent les opérations que l'ordinateur doit effectuer sur un ensemble de données.

Cela dit, functionssont un sous-ensemble logique du programme. En appeler un est entièrement dans votre processus. C'est commandun programme (ou un shell intégré) qui peut être exécuté à partir du shell de commande. La commande implémente des fonctions qui exécutent une tâche. L'inverse n'est pas correct.


la source
10
"une fonction renvoie une seule valeur, et ne produit rien" - enfin, oui, au sens mathématique peut-être. Mais dans les langages de programmation impératifs, il est très courant que "fonction" signifie juste un sous-programme, qui pourrait faire n'importe quoi. Et les fonctions shell en particulier peuvent très bien avoir des effets de sortie ou d'autres effets secondaires, car la valeur de retour des fonctions est si limitée.
ilkkachu
@ilkkachu. Je vous remercie. J'ai mis à jour la réponse. N'hésitez pas à réviser ;-)
3
Je pense que ces définitions proviennent d'un contexte de langage de programmation, pas d'un contexte de shell. Oui, je sais que le langage shell est un langage de programmation, mais son idée d'une "fonction" est assez différente de la définition mathématique ou informatique - dans le shell, toutes les commandes (qu'elles soient intégrées, fonctions, alias, programmes ou scripts) agissent et sont simplement différents types de mise en œuvre.
Toby Speight
1
... * surtout * pareil; les commandes internes peuvent changer l'état du shell lui-même, tandis que les programmes externes ne peuvent pas appeler chdir()ou setenv()dans le shell qui est, pour eux, un processus parent distinct.
Charles Duffy
1

Je voudrais savoir si les commandes que nous appelons dans le shell sont des fonctions ou des programmes?

Oui.

Plus précisément, lorsque vous tapez du texte et appuyez sur enter, le shell doit déterminer si c'est:

  1. un alias,
  2. une fonction,
  3. une commande intégrée,
  4. un fichier exécutable.
RonJohn
la source