Si je tape
::
dans un shell bash, j'obtiens:
-bash: ::: command not found
Mais, un seul ne :
génère aucune sortie. Pourquoi est-ce?
command-line
bash
NerdOfLinux
la source
la source
Réponses:
Le
:
shell intégré vs inexistant::
La
:
commande intégrée du shell existe (notez la différence entre les commandes externes et intégrées ) qui ne fait rien; il renvoie juste le succès, tout comme latrue
commande. La fonction:
intégrée est standard et définie par la norme POSIX , où elle est également connue sous le nom d '"utilitaire nul". Il est fréquemment utilisé pour tester ou exécuter des boucles infinies comme danswhile : ; do ...;done
Cependant,
::
- deux deux points ensemble - sont interprétés comme un "mot" pour le shell, et cela suppose que c'est une commande que l'utilisateur a entrée. Le shell passera par le processus de vérification des intégrés, puis n'importe quel répertoire de laPATH
variable pour l'existence de cette commande. Mais il n'y a ni commande intégrée::
ni commande externe::
. Par conséquent, cela produit une erreur.Eh bien, quel est le format typique d'une erreur?
Ainsi, ce que vous voyez n'est pas 3 colons mais ce que vous avez tapé collé dans le format d'erreur standard.
Notez également que cela
:
peut prendre des arguments en ligne de commande, c'est-à-dire qu'il est légal de le faire:Dans ce cas, le shell considérera cela comme deux "mots", dont l'un est une commande et l'autre un paramètre positionnel. Cela ne produira également aucune erreur! (Voir également la note historique (plus loin dans cette réponse) sur l'utilisation de of
:
avec des paramètres positionnels.)En coquilles autres que bash
Notez que le formatage peut également varier entre différents shells. Pour
bash
,ksh
etmksh
le comportement est cohérent. Par exemple, le/bin/sh
shell par défaut d'Ubuntu (qui est en fait/bin/dash
):où 1 est le numéro de commande (équivalent au numéro de ligne dans un script).
csh
en revanche, ne produit aucun message d'erreur:En fait, si vous exécutez
strace -o csh.trace csh -c ::
, la sortie de trace dans lecsh.trace
fichier révèle que lescsh
sorties avec le statut de sortie 0 (aucune erreur). Maistcsh
génère l'erreur (sans sortir son nom, cependant):Messages d'erreur
En général, le premier élément du message d'erreur doit être le processus ou la fonction d'exécution (votre shell essaie de s'exécuter
::
, d'où le message d'erreur vient du shell). Par exemple, voici le processus d'exécutionstat
:En fait, POSIX définit la fonction perror () qui, selon la documentation, prend un argument de chaîne, puis génère un message d'erreur après deux-points, puis une nouvelle ligne. Citation:
Et l'argument chaîne à
perror()
techniquement pourrait être n'importe quoi, mais bien sûr, pour plus de clarté, c'est généralement le nom de la fonction ouargv[0]
.En revanche, GNU possède son propre ensemble de fonctions et de variables pour la gestion des erreurs , qu'un programmeur peut utiliser
fprintf()
pourstderr
diffuser. Comme le montre l'un des exemples de la page liée, quelque chose comme cela pourrait être fait:Note historique
Dans l'ancien shell Unix et Thompson,
:
était utilisé avec l'goto
instruction (qui, selon l'utilisateur nommé Perderabo sur ce thread, n'était pas un shell intégré). Citation du manuel:Vous pouvez donc faire quelque chose comme ça pour créer un script de boucle infinie:
la source
command.com
et Windowscmd.exe
ont une situation similaire mais opposée::
est explicitement une étiquette goto (pas une commande) et souvent réutilisée comme un caractère de commentaire (par exemple:: This is a comment
).Le dernier deux-points n'est qu'une partie du message par défaut "introuvable":
La raison pour laquelle un seul deux-points ne produit rien est qu'il
:
s'agit d' une commande valide - bien qu'elle ne fasse rien (sauf retourTRUE
). De laSHELL BUILTIN COMMANDS
section deman bash
:Vous le verrez parfois dans des constructions comme
Voir par exemple À quoi sert la fonction intégrée du côlon?
la source
Essayez n'importe quelle autre commande inexistante et vous verrez que le
:
sert son objectif normal en anglais:la source
Les deux points ajoutés font partie du message d'erreur lui-même. Si l'on tape,
cd ow
il en résultebash: cd: ow: No such file or directory
, ce qui montre que l'erreur met les deux points supplémentaires: No such file or directory
la source
le 3ème est un espaceur de formatage
dans bash a
:
est une instruction vide de ligne videla source
vous obtenez 3 deux points car le format d'erreur contient deux points:
la source