Comment utiliser "Here Documents" dans Bash sous Linux

Publié: 2022-01-29
Une fenêtre de terminal sur un système informatique Linux.
Fatmawati Achmad Zaenuri/Shutterstock

Les "documents ici" étrangement nommés vous permettent d'utiliser la redirection d'entrée/sortie dans les scripts Bash sous Linux. Ils constituent un excellent moyen d'automatiser les commandes dont vous avez besoin pour exécuter sur un ordinateur distant.

Ici Documents

De nombreuses commandes sous Linux ont des noms à deux ou trois lettres. C'est en partie ce qui donne lieu à l'idée que Linux est difficile à apprendre et plein de commandes obscures. Mais l'un des noms les plus étranges de Linux n'est pas l'un des plus courts. Les « documents ici » ne sont pas des documents, et ce à quoi le « ici » fait référence n'est pas vraiment clair non plus.

Ils sont une construction relativement obscure, mais ils sont utiles. Bien sûr, c'est Linux, donc il y a plus d'une façon d'écorcher un chat. Certaines des fonctionnalités fournies par ces documents peuvent être reproduites d'autres manières. Ces méthodes alternatives sont généralement plus compliquées. Dans la programmation et les scripts, « plus compliqué » signifie également « plus sujet aux bogues » et que votre code est plus difficile à maintenir.

Ici, les documents excellent vraiment dans l'automatisation des commandes que vous souhaitez envoyer à un ordinateur distant à partir d'une connexion établie à partir d'un script. Établir la connexion est facile, mais une fois la connexion établie, comment "pomper" vos commandes de votre script dans le shell de l'ordinateur distant ? Ici, les documents vous permettent de le faire très simplement.

Principes de base des documents Here

La représentation idiomatique d'un document ici ressemble à ceci :

 COMMANDE << chaîne_limite
 .
 .
texte 
Les données
variables
.
.
limit_string
  • COMMANDE : il peut s'agir de n'importe quelle commande Linux qui accepte les entrées redirigées. Notez que la commande echo n'accepte pas les entrées redirigées. Si vous avez besoin d'écrire sur l'écran, vous pouvez utiliser la commande cat , qui le fait.
  • << : L'opérateur de redirection.
  • limit_string : Il s'agit d'une étiquette. Cela peut être ce que vous voulez tant qu'il n'apparaît pas dans la liste des données que vous redirigez dans la commande. Il est utilisé pour marquer la fin de la liste de texte, de données et de variables.
  • Liste de données : une liste de données à fournir à la commande. Il peut contenir des commandes, du texte et des variables. Le contenu de la liste de données est introduit dans la commande une ligne à la fois jusqu'à ce que la _limit_string soit rencontrée.
Publicité

Vous verrez probablement ici des exemples de documents qui utilisent "EOF" comme chaîne limite. Nous ne favorisons pas cette approche. Cela fonctionne, mais "EOF" signifie "Fin de fichier". Hormis le cas rare où un document personnel est la dernière chose dans un fichier de script, "EOF" est utilisé à tort.

Cela rendra vos scripts beaucoup plus lisibles si vous utilisez une chaîne limite qui fait référence à ce que vous faites. Si vous envoyez une série de commandes à un ordinateur distant via Secure Shell (SSH), une chaîne de limite appelée quelque chose comme "_remote_commands" serait parfaitement logique. Vous n'avez pas besoin de les faire commencer par un caractère de soulignement " _ ". Nous le faisons parce que cela les marque comme quelque chose d'extraordinaire dans votre script.

Exemples simples

Vous pouvez utiliser ici des documents sur la ligne de commande et dans des scripts. Lorsque vous tapez ce qui suit dans une fenêtre de terminal, vous verrez une invite de continuation de ligne " > " chaque fois que vous appuyez sur "Entrée". Lorsque vous tapez la chaîne de limite "_end_of_text" et appuyez sur "Entrée", la liste des sites Web est transmise à cat, et ils sont affichés dans la fenêtre du terminal.

 chat << _end_of_text 
Geek pratique 
Avis Geek 
Sens de la vie 
Informatique CloudSavvy
MindBounce
_end_of_text 

Ce n'est pas l'exercice le plus intéressant, mais cela démontre que rien n'est envoyé à la commande tant que la liste complète des données n'est pas rassemblée et que la chaîne limite n'est pas rencontrée. La commande cat ne reçoit aucune entrée tant que vous n'avez pas entré la chaîne limite "_end_of_text" et appuyé sur la touche "Entrée".

Nous pouvons faire la même chose dans un script. Tapez ou copiez cet exemple dans un éditeur, enregistrez le fichier sous "heredoc-1.sh" et fermez l'éditeur.

 #!/bin/bash

chat << "_end_of_text"
Votre nom d'utilisateur est : $(whoami)
Votre répertoire de travail actuel est : $PWD
Votre version de Bash est : $BASH_VERSION
_end_of_text

En suivant cet article, chaque fois que vous créez un script, vous devez le rendre exécutable avant qu'il ne s'exécute. Dans chaque cas, utilisez la commande chmod . Remplacez le nom du script dans chaque exemple par le nom du script utilisé ici.

 chmod +x heredoc-1.sh 

Publicité

Ce script contient deux variables d'environnement, $PWD et $BASH_VERSION . Les noms des variables d'environnement sont remplacés par leurs valeurs de données (le répertoire de travail actuel et la version de Bash) lorsque le script est exécuté.

Le script utilise également la substitution de commande sur la commande whoami . Le nom de la commande est remplacé par sa propre sortie. La sortie du script entier est écrite dans la fenêtre du terminal par la commande cat. Nous exécutons le script en l'appelant par son nom :

 ./heredoc-1.sh 

Si vous modifiez le script et placez la chaîne limite dans la première ligne du document ici entre guillemets " " ", la liste de données est transmise textuellement à la commande du document ici. Les noms de variable sont affichés à la place des valeurs de variable et la substitution de commande pas avoir lieu.

 #!/bin/bash

chat <<- "_end_of_text"
Votre nom d'utilisateur est : $(whoami)
Votre répertoire de travail actuel est : $PWD
Votre version de Bash est : $BASH_VERSION
_end_of_text
 ./heredoc-1.sh 

Gestion des caractères de tabulation

Par défaut, les caractères de tabulation de votre liste de données seront conservés et écrits dans la fenêtre du terminal. Copiez et enregistrez cet exemple sous « heredoc-2.sh ». Rendez-le exécutable à l'aide de la commande chmod . Modifiez les lignes en retrait pour vous assurer qu'elles comportent un ou deux caractères de tabulation au début de la ligne plutôt qu'une série d'espaces.

 #!/bin/bash

chat << _end_of_text
Votre nom d'utilisateur est : $(whoami)
  Votre répertoire de travail actuel est : $PWD
    Votre version de Bash est : $BASH_VERSION
_end_of_text
 ./heredoc-2.sh 

Les onglets sont écrits dans la fenêtre du terminal.

En ajoutant un tiret « - » à l'opérateur de redirection, le document ici ignorera les caractères de tabulation en tête. Enregistrez cet exemple sous "heredoc-3.sh" et rendez-le exécutable.

 #!/bin/bash

chat <<- _end_of_text
Votre nom d'utilisateur est : $(whoami)
  Votre répertoire de travail actuel est : $PWD
    Votre version de Bash est : $BASH_VERSION
_end_of_text
 ./heredoc-3.sh 

Les onglets sont ignorés. Cela peut sembler trivial, mais c'est une bonne façon de gérer les onglets principaux en raison des sections indentées des scripts.

Publicité

Les boucles et autres constructions logiques sont généralement indentées. Si votre document ici est contenu dans une section en retrait d'un script, l'utilisation d'un tiret « - » avec l'opérateur de redirection supprime les problèmes de mise en forme causés par les tabulations de début.

 #!/bin/bash

si vrai; ensuite
  chat <<- _limit_string
  Ligne 1 avec une tabulation en tête.
  Ligne 2 avec une tabulation en tête.
  Ligne 3 avec une tabulation en tête.
  _limit_string
Fi

Redirection vers un fichier

La sortie de la commande utilisée avec le document here peut être redirigée vers un fichier. Utilisez les opérateurs de redirection « > » (créer le fichier) ou « >> » (créer le fichier s'il n'existe pas, ajouter au fichier s'il existe) après la chaîne de limite dans la première ligne du document ici.

Ce script est "heredoc-4.sh". Il redirigera sa sortie vers un fichier texte appelé "session.txt".

 #!/bin/bash

chat << _end_of_text > session.txt
Votre nom d'utilisateur est : $(whoami)
Votre répertoire de travail actuel est : $PWD
Votre version de Bash est : $BASH_VERSION
_end_of_text
 ./heredoc-4.sh
 chat session.text 

Canalisation de la sortie vers une autre commande

La sortie de la commande utilisée dans un document here peut être canalisée comme entrée d'une autre commande. Utilisez le tuyau " | ” opérateur après la chaîne de limite dans la première ligne du document ici. Nous allons diriger la sortie de la commande here document, cat , vers sed . Nous voulons remplacer toutes les occurrences de la lettre "a" par la lettre "e".

Nommez ce script "heredoc-5.sh".

 #!/bin/bash

chat << _end_of_text | sed 's/a/e/g'
Comment
À
Gaak
_end_of_text
 ./heredoc-5.sh

"Gaak" est corrigé en "Geek".

Envoi de paramètres à une fonction

La commande utilisée avec un document ici peut être une fonction dans le script.

Ce script transmet certaines données du véhicule dans une fonction. La fonction lit les données comme si elles avaient été saisies par un utilisateur. Les valeurs des variables sont alors imprimées. Enregistrez ce script sous "heredoc-6.sh".

 #!/bin/bash

# la fonction set_car_details()
set_car_details ()
{
lire faire
lire le modèle
lire neuf_utilisé
lire delivery_collect
lire l'emplacement
lire le prix
}

# Le document ici qui transmet les données à set_car_details()
set_car_details << _mars_rover_data
Nasa
Rover de persévérance
Utilisé
Collecter
Mars (long, lat) 77.451865,18.445161
2,2 milliards
_mars_rover_data

# Récupérer les détails du véhicule
echo "Créer : $faire"
echo "Modèle : $modèle"
echo "Nouveau ou utilisé : $nouveau_utilisé"
echo "Livraison ou Collecte : $delivery_collect"
echo "Emplacement : $emplacement"
echo "Prix \$ : $prix"
 ./heredoc-6.sh 

Les détails du véhicule sont écrits dans la fenêtre du terminal.

Création et envoi d'un e-mail

Nous pouvons utiliser un document ici pour composer et envoyer un e-mail. Notez que nous pouvons passer des paramètres à la commande devant l'opérateur de redirection. Nous utilisons la commande Linux mail pour envoyer un e-mail via le système de messagerie local au compte d'utilisateur appelé "dave". L'option -s (objet) nous permet de spécifier l'objet de l'e-mail.

Cet exemple forme le script "heredoc-7.sh".

 #!/bin/bash

article="Voici les documents"

mail -s 'Statut de la charge de travail' dave << _project_report
Nom d'utilisateur : $(whoami)
A terminé la mission :
Article : $article
_rapport de projet
 ./heredoc-7.sh 

Publicité

Il n'y a pas de sortie visible de ce script. Mais lorsque nous vérifions notre courrier, nous constatons que l'e-mail a été composé, envoyé et livré.

 poster 

Utilisation de documents ici avec SSH

Ici, les documents sont un moyen puissant et pratique d'exécuter certaines commandes sur un ordinateur distant une fois qu'une connexion SSH a été établie. Si vous avez configuré des clés SSH entre les deux ordinateurs, le processus de connexion sera entièrement automatique. Dans cet exemple rapide et grossier, vous serez invité à saisir le mot de passe du compte d'utilisateur sur l'ordinateur distant.

Ce script est "heredoc-8.sh". Nous allons nous connecter à un ordinateur distant appelé « remote-pc ». Le compte utilisateur s'appelle "dave". Nous utilisons l' -T (désactiver l'allocation de pseudo-terminal) car nous n'avons pas besoin qu'un pseudo-terminal interactif nous soit attribué.

Dans la section "faire du travail ici" du script, nous pourrions passer une liste de commandes, et celles-ci seraient exécutées sur l'ordinateur distant. Bien sûr, vous pouvez simplement appeler un script qui se trouve sur l'ordinateur distant. Le script distant peut contenir toutes les commandes et routines que vous souhaitez exécuter.

Tout ce que notre script - heredoc-8.sh - va faire est de mettre à jour un journal de connexion sur l'ordinateur distant. Le compte d'utilisateur et un horodatage sont consignés dans un fichier texte.

 #!/bin/bash

ssh -T [email protected] << _remote_commands

# faire du travail ici

# mettre à jour le journal de connexion
echo $USER "-" $(date) >> /home/dave/conn_log/script.log
_remote_commands
Publicité

Lorsque nous exécutons la commande, nous sommes invités à saisir le mot de passe du compte sur l'ordinateur distant .

 ./heredoc-8.sh 

Certaines informations sur l'ordinateur distant s'affichent et nous revenons à l'invite de commande.

Sur l'ordinateur distant , nous pouvons utiliser cat pour vérifier le journal de connexion :

 chat conn_log/script.log 

Chaque connexion est répertoriée pour nous.

CONNEXION: Comment créer et installer des clés SSH à partir du shell Linux

Nom étrange, fonctionnalités intéressantes

Ici, les documents sont originaux mais puissants, en particulier lorsqu'ils sont utilisés pour envoyer des commandes à un ordinateur distant. Il serait simple de créer un script de routine de sauvegarde à l'aide de rsync . Le script pourrait alors se connecter à l'ordinateur distant, vérifier l'espace de stockage restant et envoyer un e-mail d'alerte si l'espace devenait faible.

CONNEXION: Comment sauvegarder votre système Linux avec rsync