Oui, l'espacement entre les mots et les redirections n'a pas d'importance. C'est la réponse courte.
Les détails résident dans le fait que Shell (pour simplifier, appelons-le simplement bash
uniquement) traite certains caractères et groupes de caractères comme des "mots" et des "métacaractères". Extrait du manuel de bash 4.3 :
métacaractère
Caractère qui, lorsqu'il n'est pas mis entre guillemets, sépare les mots. L'un des éléments suivants :
| & ; ( ) < > space tab
Y
mot Séquence de caractères considérée comme une seule unité par le Shell. Également connu sous le nom de jeton.
Ainsi, lorsque nous le faisons :
$ echo "hello world">/dev/null
または
$ echo "hello world" > /dev/null
c'est toujours 3 mots ("hello world" peut être considéré comme un seul mot Shell parce qu'il est cité), avec une >
méta-caractère et couple d'espaces. Shell le verra et effectuera d'abord une redirection (il cherchera donc d'abord les métacaractères), puis exécutera les commandes conformément à son comportement standard.
L'ordre des redirections a cependant beaucoup d'importance, en particulier lorsque vous dupliquez des descripteurs de fichiers avec quelque chose comme 2>&1
. Disons que vous voulez envoyer stderr et stdin au même endroit. Voici une mauvaise façon de procéder :
$ stat ./non-existent file 2>&1 > /dev/null
stat: cannot stat './non-existent': No such file or directory
stat: cannot stat 'file': No such file or directory
Vous créez un descripteur de fichier 2
au même endroit que 1
qui est votre terminal, mais c'est ce qu'il faisait déjà. C'est pourquoi stderr apparaît.
Si vous redirigez stdout
d'abord, et ensuite seulement, modifier l'endroit où 2
points - alors cela fonctionnera :
$ stat ./non-existent file > /dev/null 2>&1