Comment fonctionne la redirection Shell ci-dessous? Semble compliqué pour comprendre l'ordre d'exécution. Une explication facile?
uuencode Host-file < Host-file >encodedfile
uuencode
est la commande. Host-file
est son argument. < Host-file
redirige le fichier vers l'entrée standard de la commande. >encodedfile
redirige la sortie de la commande vers le fichier.
Lorsqu'un programme de console est lancé, il ouvre trois descripteurs de fichiers standard:
0 STDIN
1 STDOUT
2 STDERR
Normalement, le descripteur de fichier STDIN lit à partir de l'entrée du terminal (c'est-à-dire le clavier). Mais quand le <
la redirection est utilisée, l'entrée est lue à partir de ce fichier à la place. De même, STDOUT écrit généralement sur le terminal, mais lorsque >
est utilisé, la sortie est écrite dans ce fichier à la place.
STDERR peut également être redirigé en utilisant 2>
. Vous pouvez également voir STDERR redirigé vers le même endroit que STDOUT en utilisant 2>&1
.
uuencode Host-file < Host-file >encodedfile
Décomposons cela en 4 parties:
uuencode
est le nom de la commande à exécuter. Le shell recherche la variable d'environnement PATH ($ PATH) et recherche un fichier exécutable nommé uuencode
dans chaque répertoire du PATH. Dans une installation standard, ce sera /usr/bin/uuencode
. Le programme uuencode prend un fichier binaire et le transforme en texte dans un format spécial afin qu'il puisse être envoyé sur un réseau qui ne peut pas gérer les caractères non ascii.Host-file
Est l'argument de ligne de commande de uuencode
. La commande uuencode
a besoin d'un argument pour pouvoir mettre le nom du fichier dans la version encodée. La première ligne du fichier encodé ressemblera à ceci: begin 644 Host-file
< Host-file
Est le shell utilisant un fichier nommé Host-file
Comme entrée standard (stdin) pour le processus uuencode
. Ainsi, lorsque uuencode
lit certains octets d'entrée, au lieu de provenir de votre clavier, ils proviennent de ce fichier.>encodefile
Est le Shell utilisant un fichier nommé encodedfile
comme sortie standard (stdout). Ainsi, lorsque uuencode
écrit une sortie, au lieu d'aller sur votre écran, elle va dans ce fichier.Il n'y a pas vraiment d'ordre d'exécution, car une seule commande, uuencode
, est en cours d'exécution. Si vous voulez des détails techniques, lisez la suite.
En arrière-plan, le shell appelle fork()
, puis le processus enfant ouvre le fichier Host-file
Pour lecture, ouvre le fichier encodedfile
pour écriture et appelle exec()
, qui remplace le processus enfant (une copie du processus Shell) par le processus uuencode
. Le processus enfant devient alors uuencode
, avec le descripteur de fichier d'entrée (une manière dont le système d'exploitation garde la trace des fichiers ouverts) défini sur celui de Host-file
Et le descripteur de fichier de sortie défini sur celui de encodedfile
.