Avant que le shell n'exécute la cat
commande sur la ligne de commande, il recherche des redirections.
Il y a deux redirections:
>file1
Cela rendra la sortie standard de la commande à file1
.
<file2
Cela rendra l'entrée standard de la commande file2
.
Le fait que ces redirections soient placées dans un emplacement insignifiant sur la ligne de commande importe peu.
$ cat <file2 >file1
est le même que
$ <file2 cat >file1
qui est le même que
$ <file2 >file1 cat
etc.¹
Notez que l' cat
utilitaire dans toutes ces instances est exécuté sans aucun argument de ligne de commande . Les redirections ne sont pas des opérandes pour la cat
commande, mais des instructions pour permettre au shell de configurer des redirections dans et hors de la commande (en connectant son entrée et sa sortie standard à des fichiers). Le shell configure les redirections avant d' appeler la commande.
La différence entre cat file
et cat <file
(ou, si l' on veut, <file cat
) est que , dans le premier cas, l' cat
utilitaire lui-même ouvre le fichier, qui est donné comme un opérande sur la ligne de commande, pour la lecture, tandis que dans le second cas, la coque aura ouvrez le fichier et connectez cat
le flux d 'entrée à it². Dans le second cas, cat
remarquerez qu’il n’a pas reçu d’opérande de fichier et basculera automatiquement en lecture depuis son entrée standard. Il s’agit d’une caractéristique cat
et d’autres utilitaires que tous les utilitaires ne font pas.
cat
lit également à partir de son entrée standard si on lui donne l'opérande -
. Encore une fois, cela n’est spécial que vers cat
et pour certains autres utilitaires (c’est-à-dire que le shell ne fait pas). Pour utiliser cat
un fichier dans le répertoire courant dont le nom est -
, ajoutez un chemin d'accès au nom de fichier, par exemple ./-
.
¹ L’ordre des redirections est toujours important dans certaines circonstances; Avec cat <file2 >file1
, par exemple, file1
ne sera pas tronqué s'il file2
est inaccessible (les redirections sont analysées de gauche à droite). Le placement relatif du mot cat
est cependant toujours arbitraire et n'influencera pas cela.
² Voir également la question " cat donne une erreur différente lors de l'ouverture d'un fichier non existant ".
Le fait que le shell configure les redirections avant même d'exécuter la commande sur la ligne de commande explique pourquoi de telles choses échouent et que vous vous retrouvez avec un fichier de sortie vide:
$ sort file >file
Ici, le shell tronquera (vide) le fichier file
avant d'exécuter sort file
et de connecter sort
la sortie standard au fichier. L' sort
utilitaire va alors ouvrir file
et trier son contenu (ce qui n'est rien). Le résultat (rien) est transmis au flux de sortie standard file
.
Le remède dans ce cas particulier (pour trier un fichier "sur place") est
$ sort -o file file
ou
$ sort file >file.sorted && mv file.sorted file
ce qui est plus ou moins ce que sort
fait lorsque vous utilisez le -o
fichier pour spécifier le nom du fichier de sortie.
Sauvegardez simplement que les redirections peuvent précéder le nom réel de l’utilitaire sur la ligne de commande:
Une "commande simple" est une séquence d'affectations de variables et de redirections facultatives, dans toute séquence, éventuellement suivies de mots et de redirections, terminées par un opérateur de contrôle. [ref: POSIX Shell Command Language 2.9.1 Commandes simples]
Et aussi à propos de la redirection ne faisant pas partie des opérandes de l'utilitaire:
Le numéro facultatif, l'opérateur de redirection et le mot ne doivent pas apparaître dans les arguments fournis à la commande à exécuter (le cas échéant). [ref: Redirection du langage de commande POSIX Shell 2.7]