Quel est l'identifiant du jeton de «]»?

9

Le manuel de Bash dit:

Lorsque le [formulaire est utilisé, le dernier argument de la commande doit être un].

$ type [
[ is a shell builtin
$ type ]
bash: type: ]: not found

Ce ]n'est donc pas un mot réservé, ni un opérateur, ni une commande intégrée.

En tant que jeton, quel est l'identifiant du jeton ]? MOT ou NOM?

Tim
la source
4
En fait, [est (également) une commande auto-entretenue: -rwxr-xr-x 1 root root 39552 3 décembre 18:14 / usr / bin / [Bien qu'il soit possible qu'il y ait aussi un "parallèle" intégré, comme il y en a pour par exemple kill. Sur certains systèmes, la testcommande est un lien symbolique vers [ou vice versa. AFAIK, ]ne veut rien dire en soi, mais est accepté de "fermer" un [- mais c'est plus pour une raison "esthétique".
Baard Kopperud
5
Le langage shell s'est développé couche par couche au cours des 46 dernières années, et la cohérence interne n'a jamais été une priorité. Si vous essayez de l'intégrer de force dans n'importe quel type de cadre théorique du langage formel, vous allez avoir un mauvais moment.
zwol
Comme il [s'agit (également) d'une commande autonome, elle contient généralement une page de manuel ... Essayez donc man [et / ou man test( [et il testpeut s'agir de la même commande).
Baard Kopperud
Essayez de coller les ]guillemets simples ou doubles et vous verrez que cela ne fait aucune différence; c'est juste une chaîne.
Wildcard

Réponses:

21

]compléments [, c'est le signe de fermeture du [commandement.

Comme le souligne la manpage, il s'agit en fait d'un argument [, mais [il arrive de le traiter en particulier, comme la fin.

Vous pouvez lui ressembler avec d'autres modèles de fermeture de commande, par exemple ;dans find .. exec.

heemayl
la source
Merci. De quel type / identifiant de jeton s'agit-il ]?
Tim
8
@Tim ]n'est pas différent de tout autre caractère normal dans ce contexte (comme argument d'une commande). La testcommande le traite spécialement, mais cela dépend de la commande.
muru
6
C'est juste une chaîne et [déclenche une erreur si son argument final n'est pas exactement égal à ].
chepner
19

Bash ne traite pas les caractères [ou ](à eux seuls) différemment d'une lettre de l'alphabet.

Dans ce cas, bash voit un "mot" [, et recherche une commande avec ce nom. Si vous regardez dans votre système de fichiers, vous constaterez probablement que /bin/[(ou /usr/bin/[) existe en tant que fichier exécutable. En l'occurrence, bash fournit également une version intégrée (pour des raisons d'efficacité), mais ce n'est qu'un détail d'implémentation.

La [commande (comme dans l'exécutable portant ce nom), a une règle selon laquelle le dernier paramètre que vous lui passez doit être, ]sinon elle génère une erreur. Cela peut être en partie parce que c'est esthétique, mais cela sert également à vous protéger contre les commandes accidentellement tronquées, ce qui est bien.

Le fait que ceux-ci ne soient pas spéciaux est la raison pour laquelle vous ne pouvez pas omettre l'espace blanc avant et après le [ou ].


Exceptions :

  • Quand [et ]se produire dans le format correct dans le même mot, par exemple [a-z], alors c'est des règles spéciales et de jokers bash appliquent.
  • La [[commande est spéciale et peut faire beaucoup de choses [non (et les paramètres à l'intérieur [[ .. ]]sont traités différemment, tout comme certains sauts de ligne). Le correspondant ]]est également spécial, car il s'agit d'un mot réservé au shell qui ne peut pas être un nom de commande et met fin au traitement spécial qui suit le [[mot clé.
ams
la source
1
@JacobKrall Ce n'est pas un caractère spécial comme ;ou >, c'est juste une commande intégrée comme cd. En particulier, si vous tapez [x, le [n'a pas de signification particulière.
Barmar
2
@JacobKrall C'est vrai pour toutes les commandes intégrées. [est une commande spéciale , ce n'est pas un caractère spécial .
Barmar
@Barmar: Assez juste; Je retire mes commentaires.
Jacob Krall
En fait, ]]c'est plus spécial que ]. Lors de l'utilisation [et ]ce ne sont que des mots. Si vous l'avez omis ]ou remplacé par un mot différent, bash s'exécutera toujours [, mais [produira une erreur. Cependant [[, ils ]]sont traités spécialement au moment de l'analyse. Si vous avez remplacé ]]par autre chose, bash signalera une erreur de syntaxe. Et si vous omettez ]]bash, continuez d'analyser la ligne suivante à la recherche de ]].
kasperd
@kasperd réponse ajustée.
Ams
3

Pour le dire plus simplement que les deux réponses précédentes, ]c'est juste une chaîne qui [nécessite de s'exécuter.

Kenny
la source
1
Cela ressemble un peu à un commentaire ...
wizzwizz4
@ wizzwizz4, étant donné les questions de suivi du PO dans les commentaires, je pense que cette simplicité est exactement ce dont il avait besoin.
Wildcard
@Wildcard, je suis d'accord. Il y avait quelque chose qui me tentait de voter pour cette réponse, mais je pensais que c'était de mauvaise qualité. (Mais je n'ai pas baissé les voix!) Je vais modifier pour améliorer le balisage.
wizzwizz4