Dans le post précédent, nous avons parlé en détail des paramètres et des options. Aujourd'hui, nous allons parler de quelque chose d'essentiel dans les scripts shell, à savoir l'entrée, la sortie et la redirection.
Vous pouvez afficher la sortie de vos scripts shell de deux manières :
- Afficher la sortie à l'écran.
- Envoyer la sortie vers un fichier.
Descripteurs de fichiers standards
Tout est un fichier sous Linux, et cela inclut l'entrée et la sortie.
Chaque processus peut avoir neuf descripteurs de fichiers ouverts en même temps. Les descripteurs de fichier 0, 1, 2 sont conservés pour l'utilisation du shell bash.
0 STDIN.
1 STDOUT.
2 STDERR.
Vous pouvez utiliser les descripteurs de fichiers ci-dessus pour contrôler l'entrée et la sortie.
Vous devez bien comprendre ces trois éléments car ils sont comme les piliers de votre script shell. Nous allons donc les décrire en détail.
STDIN
STDIN signifie entrée standard, qui est le clavier par défaut.
Vous pouvez remplacer le STDIN, qui est le clavier, et le remplacer par un fichier en utilisant le symbole de redirection d'entrée (<), il envoie les données au clavier. Pas de magie !!
Lorsque vous tapez la commande cat sans rien, elle accepte les entrées de STDIN. N'importe quelle ligne que vous tapez, la commande cat imprime cette ligne à l'écran.
SORTIE STD
Le STDOUT représente la sortie standard, qui est l'écran par défaut.
Vous pouvez rediriger la sortie vers un fichier en utilisant le symbole>>.
Si nous avons un fichier contenant des données, vous pouvez y ajouter des données en utilisant ce symbole comme ceci :
pwd >> myfile
La sortie générée par pwd est ajoutée à monfichier sans supprimer le contenu existant.
La commande suivante tente de rediriger la sortie vers un fichier en utilisant le symbole >.
ls –l xfile > myfile
Je n'ai pas de fichier appelé xfile sur mon PC, et cela génère une erreur qui est envoyée à STDERR.
STDERR
Le shell envoie les erreurs à l'écran par défaut.
Si vous devez rediriger les erreurs vers un fichier journal au lieu de l'envoyer à l'écran, vous pouvez rediriger les erreurs à l'aide du symbole de redirection.
Erreurs de redirection
Nous pouvons rediriger les erreurs en plaçant le descripteur de fichier qui est 2 avant le symbole de redirection comme ceci :
ls -l xfile 2>myfile
cat ./myfile
Comme vous pouvez le voir, l'erreur est maintenant dans le fichier et rien à l'écran.
Erreurs de redirection et sortie normale
Pour rediriger les erreurs et la sortie normale, vous devez faire précéder chacune du bon descripteur de fichier comme ceci :
ls –l myfile xfile anotherfile 2> errorcontent 1> correctcontent
Le résultat de la commande ls est envoyé au bon fichier de contenu à l'aide de 1> symbole. Et les messages d'erreur ont été envoyés au fichier errorcontent en utilisant le 2> symbole.
Vous pouvez rediriger la sortie normale et les erreurs vers le même fichier à l'aide de &> symbole comme celui-ci :
ls –l myfile xfile anotherfile &> content
ici, nous redirigeons les erreurs et la sortie normale vers un fichier nommé content.
Redirection de sortie
Il existe deux façons de rediriger la sortie :
- Redirection temporaire.
- Redirection permanente.
Redirections temporaires
Pour les redirections temporaires, vous pouvez utiliser le symbole>&2 comme ceci :
#!/bin/bash echo "Error message" >&2 echo "Normal message"
Donc, si nous l'exécutons, nous verrons les deux lignes imprimées normalement car, comme nous le savons, les erreurs vont à l'écran par défaut.
Vous pouvez rediriger les erreurs vers un fichier comme celui-ci :
./myscript 2> myfile
Les scripts shell sont géniaux ! La sortie normale est envoyée à l'écran, tandis que le message d'écho qui a le symbole>&2 envoie des erreurs au fichier.
Redirections permanentes
Si vous avez beaucoup de données à rediriger, vous pouvez avoir une redirection permanente en utilisant la commande exec comme ceci :
#!/bin/bash exec 1>outfile echo "Permanent redirection" echo "from a shell to a file." echo "without redirecting every line"
Si nous regardons le fichier appelé outfile, nous verrons la sortie des lignes d'écho.
On redirige le STDOUT au début, qu'en est-il au milieu d'un script comme celui-ci :
#!/bin/bash exec 2>myerror echo "Script Begining ..." echo "Redirecting Output" exec 1>myfile echo "Output goes to the myfile" echo "Output goes to myerror file" >&2
La commande exec redirige toutes les erreurs vers le fichier myerror, et nous envoyons la sortie standard à l'écran.
Nous utilisons l'instruction exec 1>myfile pour rediriger la sortie vers le fichier myfile, et enfin, les erreurs sont transmises au fichier myerror en utilisant le symbole >&2.
Redirection de l'entrée
Vous pouvez rediriger l'entrée vers un fichier au lieu de STDIN en utilisant la commande exec comme ceci :
exec 0< myfile
Cette commande indique au shell de prendre l'entrée d'un fichier appelé monfichier au lieu de STDIN et voici un exemple :
#!/bin/bash exec 0<testfile total=1 while read line; do echo "#$total: $line" total=$(($total + 1)) done
Les scripts shell sont faciles.
Vous savez comment utiliser la commande read pour obtenir l'entrée de l'utilisateur. Si vous redirigez le STDIN vers un fichier, la commande de lecture essaiera de lire depuis STDIN, qui pointe vers le fichier.
Certains administrateurs système Linux utilisent cette technique pour lire les fichiers journaux à traiter, et nous discuterons d'autres façons de lire le journal sur les publications à venir de manière professionnelle.
Créer une redirection personnalisée
Vous savez qu'il existe neuf descripteurs de fichiers, vous n'en utilisez que 3 pour l'entrée, la sortie et l'erreur.
Les six descripteurs de fichiers restants peuvent être utilisés pour la redirection d'entrée et de sortie.
Nous pouvons utiliser la commande exec pour attribuer un descripteur de fichier pour une sortie comme celle-ci :
#!/bin/bash exec 3>myfile echo "This line appears on the screen" echo "This line stored on myfile" >&3 echo "This line appears on the screen"
Créer des descripteurs de fichiers d'entrée
Pour rediriger les descripteurs de fichiers d'entrée, procédez comme suit :
1- Enregistrez le STDIN dans un autre descripteur de fichier.
2- Le rediriger vers un fichier.
3- Remettez STDIN à son emplacement d'origine.
Regardez le code suivant pour comprendre ces étapes :
#!/bin/bash exec 7<&0 exec 0<myfile total=1 while read line; do echo "#$total: $line" total=$(($total + 1)) done exec 0<&7 read -p "Finished? " res case $res in y) echo "Goodbye" ;; n) echo "Sorry, this is the end." ;; esac
Nous avons enregistré le STDIN dans le descripteur de fichier 7 et redirigé le STDIN vers un fichier.
Le STDIN est revenu à son emplacement d'origine après avoir parcouru les lignes du fichier.
La dernière commande de lecture juste pour s'assurer que STDIN est rétabli et que vous pouvez utiliser le clavier normalement.
Fermer les descripteurs de fichiers
Lorsque le script se termine, les descripteurs de fichiers se ferment automatiquement. Si vous souhaitez fermer vous-même le descripteur de fichier, redirigez le descripteur de fichier vers ce symbole &- il sera fermé.
#!/bin/bash exec 3> myfile echo "Testing ..." >&3 exec 3>&- echo "Nothing works" >&3
Comme vous pouvez le voir, cela donne une erreur de mauvais descripteur de fichier car il n'existe plus.
Commande lsof
La commande lsof est utilisée pour répertorier tous les fichiers ouverts sur le système et les processus d'arrière-plan.
Sur de nombreux systèmes Linux comme Fedora, la commande lsof se trouve sous /usr/sbin.
Voici quelques-unes des options importantes de la commande lsof :
-p :pour l'ID de processus.
-d :pour le descripteur de fichier.
Vous pouvez obtenir le PID du processus en utilisant la variable $$.
Nous pouvons utiliser le -a pour combiner les résultats de l'option -p et de l'option -d.
Maintenant, testons la commande depuis un script :
#!/bin/bash exec 4> myfile1 exec 5> myfile2 exec 6< myfile3 lsof -a -p $$ -d 0,1,2,4,5,6
Le script shell crée les descripteurs de fichier 4 et 5 pour l'écriture et 6 pour la lecture.
Suppression de la sortie de la commande
Parfois, vous ne voulez voir aucune sortie. Nous redirigeons la sortie vers le trou noir, qui est /dev/null .
Par exemple, nous pouvons supprimer les erreurs comme celle-ci :
ls -al badfile anotherfile 2> /dev/null
Vous pouvez tronquer un fichier sans le supprimer complètement en utilisant la même commande.
cat /dev/null > myfile
Vous comprenez maintenant l'entrée, la sortie, comment les rediriger, comment créer votre descripteur de fichier et rediriger vers celui-ci.
J'espère que ça vous plait. Continuez à revenir.
Merci.