bash
définit plusieurs métacaractères . De man bash
:
métacaractère
Caractère qui, lorsqu'il n'est pas cité, sépare les mots. L'un des éléments suivants:
| &; () <> onglet espace
Étant donné que les métacaractères séparent les mots, peu importe qu'ils soient entourés d'espaces. Le symbole de la pipe,, |
est un métacaractère et donc, comme vous l'avez remarqué, il n'a pas besoin d'espaces autour de lui.
Notez que [
, ]
, {
, }
et =
sont pas métacaractères. Leur signification, en revanche, dépend fortement de leur entourage par des blancs.
Exemples de situations où des espaces sont et ne sont pas nécessaires
Comme vous l'avez remarqué, peu importe qu'il |
soit entouré d'espaces. Prenons quelques exemples qui confondent souvent les utilisateurs bash. Considérer:
$ (date)
Sun Mar 1 12:47:07 PST 2015
Les parens ci-dessus forcent l' date
exécution de la commande dans un sous-shell. Parce que (
et )
sont des métacaractères, aucun espace n'est nécessaire. Par contre:
$ {date}
bash: {date}: command not found
Puisque {
et ne}
sont pas des métacaractères, le shell est traité {date}
comme un seul mot. Au lieu de rechercher la date
commande, il recherche une commande nommée {date}
. Parce qu'il n'en trouve pas, une erreur se produit.
Un autre problème courant est la test
commande. Les éléments suivants fonctionnent avec succès:
$ [ abc ] && echo Yes
Yes
Supprimez les espaces et une erreur se produit:
$ [abc] && echo Yes
bash: [abc]: command not found
Parce que [
et ne]
sont pas des métacaractères, le shell est traité [.bashrc]
comme un seul mot et le résultat, comme dans l' date
exemple, est une erreur.
Les instructions d'affectation sont également sensibles aux espaces. L'affectation suivante a réussi:
$ v=date
$ echo $v
date
Ajoutez un espace et l'affectation échoue:
$ v= date
Sun Mar 1 12:55:05 PST 2015
Dans ce qui précède, le shell est temporairement défini v
sur vide, puis exécute la date
commande.
Ajouter un espace avant =
provoque également un échec, mais pour une raison différente:
$ v =date
bash: v: command not found
Ici, le shell tente d'exécuter la commande v
avec l'argument =date
. L'erreur est due au fait qu'il n'a trouvé aucune commande nommée v
.