GNU/Linux >> Tutoriels Linux >  >> Linux

Shell Scripting Part4 - Entrée, sortie et redirection

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.


Linux
  1. Lire et écrire des données de n'importe où avec la redirection dans le terminal Linux

  2. Utilisation de l'entrée-sortie et de la redirection d'erreur sous Linux

  3. Comment obtenir l'entrée et la sortie d'un terminal dans un fichier texte ? ?

  4. Rechercher et remplacer dans les scripts shell

  5. Linux :Comment utiliser un fichier en entrée et en sortie en même temps ?

Comment rediriger la sortie de la commande shell

Explication de la redirection d'entrée-sortie sur Linux

Explication :Redirection des entrées, des sorties et des erreurs sous Linux

Bash Scripting :comment générer et formater du texte sur le shell Linux

Copier et écraser un fichier dans un script shell

Utilisation de rz et sz sous linux shell