Considérer ce qui suit:
$ ksh -c '1(){ echo hi;};1'
ksh: 1: invalid function name
$ dash -c '1(){ echo hi;};1'
dash: 1: Syntax error: Bad function name
$ bash -c '1(){ echo hi;};1'
bash: `1': not a valid identifier
bash: 1: command not found
$ mksh -c '1(){ echo hi;};1'
hi
Fondamentalement, j'essayais de déclarer des fonctions 1
et 0
qui seraient des raccourcis pour true
et false
, mais comme vous pouvez le voir, j'ai rencontré des problèmes avec l'utilisation de noms numériques dans les fonctions. Le même comportement se produit avec les alias et les noms à deux chiffres.
La question est "pourquoi"? Est-ce mandaté par POSIX? ou juste un caprice de coquilles bourne?
Voir aussi la question connexe à celle-ci.
command-line
bash
dash-shell
ksh
Sergiy Kolodyazhnyy
la source
la source
0
trouvetrue
dans les scripts shell et1
estfalse
(vraiment, tout non différent de zéro est traité comme faux), au cas où quiconque le lirait ne le sait pas. C'est à l'envers de la plupart des autres langages de programmation.true
dans le shell. Cependant, dans l'expansion arithmétique, les$((...))
états de retour sont inversés - 1 esttrue
et 0 estfalse
pour la cohérence avec la syntaxe du langage C. Essayez par exemplebash -c 'echo $((1==1));echo $((1==2))'
Ce que j'essayais de faire en dehors de cette question était en fait "d'inverser" le comportement. Voir le dernier exemple de ma réponse ici pour voir exactement ce que j'essayais de faire. Idée idiote, mais fonctionne néanmoinsRéponses:
POSIX dit:
Et:
Un mot commençant par un chiffre ne peut donc pas être un nom de fonction.
la source
1L
signifierait? Un nom de fonction? Ou unlong int
littéral?()
, éventuellement avec des arguments à l'intérieur, qui dénote un appel à la fonction en question (et prend la valeur qui est retournée par la fonction appelée). Donc, si vous avez une fonctionint f() { return 42; }
en C,f
est valide dans un contexte de pointeur etf()
est valide dans un contexte entier sans pointeur.Il s'agit d'une norme dans de nombreux langages pour éviter toute confusion entre les opérations mathématiques et les variables ou fonctions ou méthodes.
Considérer:
Comme vous pouvez le voir, si les nombres étaient autorisés en tant que noms de variable ou de fonction, faire des calculs plus tard dans un programme pourrait devenir très déroutant et vous devriez trouver des solutions de rechange créatives si vous aviez besoin de faire des calculs avec ces nombres plus tard. Il peut également produire des résultats inattendus dans certaines langues. Imaginez que vous incrémentez un nombre pour une boucle, mais l'un des chiffres est déjà une variable équivalente à une chaîne. Cela déclencherait immédiatement une erreur. Si vous n'étiez pas l'auteur original du code, cette erreur pourrait prendre un certain temps à trouver.
En un mot, c'est pourquoi la plupart des langues ne vous permettent pas d'utiliser un nombre comme nom d'une variable ou d'une fonction ou d'une méthode ou etc.
la source
$
être complétées pour être développées" mais là encore, si le shell est inspiré par d'autres langages, c'est OK, je suppose, en plus dans les((
variables d' expansion arithmétiques , il n'est pas nécessaire d'avoir un leader$
. OK, je peux comprendre que$
, donc il y a ça. Mais c'est probablement secondaire à l'autre raison de "suivre la convention commune"0
le nom de script shell ou,1
,2
, ..., pour les paramètres de position,*
pour les joints,-
pour les options activées,?
le dernier état de sortie, et!
pour la PID du travail asynchrone le plus récent. (Ainsi, même dans$((
))
, le$
est souvent nécessaire.) Le code montré ici pour démontrer la justification suggérée n'est pas un script pour un shell de style Bourne, car il n'y a aucun moyen de le démontrer de cette façon, car il ne s'applique pas à leur.En C, considérez une expression comme:
Est-ce
1000l
une variable ou une constante? Étant donné que les noms de variables ne peuvent pas commencer par un chiffre, il doit s'agir d'une constante. Cela rend l'analyse plus facile et plus stricte (les fautes de frappe comme1000k
peuvent être facilement détectées). Il est également plus facile d'avoir une seule règle pour les variables et les noms de fonction, car les fonctions peuvent également être traitées comme des variables. Maintenant , bien sûr, les analyseurs sont beaucoup plus complexes et puissants, et nous avons des choses comme les littéraux personnalisés en C ++. Mais à l'époque de la préhistoire, sacrifier un peu de flexibilité inutile pouvait raccourcir considérablement la durée de votre compilation (ou interprétation) (et les gens se plaignent toujours des temps de compilation en C ++).Et vous pouvez voir les effets d'une influence C dans tout le langage shell, il n'est donc pas surprenant que le shell Bourne (ou shell C) et donc POSIX, ait restreint la classe des noms autorisés à la même chose que celle de C.
la source
&&
et||
, le manque de prise en charge de l'ASCII nul dans les chaînes,