Agence web » Actualités du digital » Comment utiliser «Here Documents» dans Bash sous Linux

Comment utiliser «Here Documents» dans Bash sous Linux

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. C’est un excellent moyen d’automatiser les commandes que vous devez exécuter sur un ordinateur distant.

Ici Documents

De nombreuses commandes sous Linux ont des noms de deux ou trois lettres. C’est en partie ce qui fait naître l’idée que Linux est difficile à apprendre et plein de commandes mystérieuses. Mais l’un des noms les plus étranges de Linux n’est pas l’un des noms cryptiquement courts. Les «documents ici» ne sont pas des documents, et il n’est pas vraiment clair à quoi se réfère le «ici» non plus.

Ils sont une construction relativement obscure, mais ils sont utiles. Bien sûr, c’est Linux, il y a donc plus d’une façon d’écorcher un chat. Certaines des fonctionnalités fournies par les documents ici peuvent être reproduites par d’autres moyens. 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.

Là où les documents excellent ici, c’est dans l’automatisation des commandes que vous souhaitez envoyer à un ordinateur distant à partir d’une connexion établie à partir d’un script. 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:

COMMAND << limit_string
 .
 .
text 
data
variables
.
.
limit_string
  • COMMANDER: Cela peut être n’importe quelle commande Linux qui accepte une entrée redirigée. Noter la echo La commande n’accepte pas l’entrée redirigée. Si vous avez besoin d’écrire à l’écran, vous pouvez utiliser le cat commande, qui fait.
  • <<: L’opérateur de redirection.
  • limit_string: Ceci est 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 vers 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 ligne par ligne jusqu’à ce que la _limit_string soit rencontrée.

Vous verrez probablement ici des exemples de documents qui utilisent «EOF» comme chaîne de 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 de 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 commencer par un trait de soulignement « _ » personnage. Nous faisons cela parce que cela les marque comme quelque chose qui sort de l’ordinaire dans votre script.

Exemples simples

Vous pouvez utiliser ici des documents en ligne de commande et dans des scripts. Lorsque vous saisissez ce qui suit dans une fenêtre de terminal, un message « >»Invite de continuation de ligne chaque fois que vous appuyez sur« Entrée ». Lorsque vous saisissez 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.

cat << _end_of_text 
How-To Geek 
Review Geek 
LifeSavvy 
CloudSavvy IT
MindBounce
_end_of_text

Ce n’est pas le plus intéressant des exercices, mais cela démontre que rien n’est envoyé à la commande tant que la liste entière des données n’est pas rassemblée et que la chaîne de limite n’est pas rencontrée. le cat La commande ne reçoit aucune entrée tant que vous n’entrez pas la chaîne de limite «_end_of_text» et que vous appuyez sur la touche «Entrée».

On peut 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

cat << "_end_of_text"
Your user name is: $(whoami)
Your current working directory is: $PWD
Your Bash version is: $BASH_VERSION
_end_of_text

Au fur et à mesure que vous suivez cet article, chaque fois que vous créez un script, vous devrez le rendre exécutable avant qu’il ne s’exécute. Dans chaque cas, utilisez le chmod commander. Remplacez le nom du script dans chaque exemple par le nom du script utilisé ici.

chmod +x heredoc-1.sh

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 substitution de commande sur le whoami commander. 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 de limite dans la première ligne du document ici entre guillemets » " «, La liste de données est transmise à la commande ici document textuellement. Les noms de variable sont affichés à la place des valeurs de variable et la substitution de commande n’a pas lieu.

#!/bin/bash

cat <<- "_end_of_text"
Your user name is: $(whoami)
Your current working directory is: $PWD
Your Bash version is: $BASH_VERSION
_end_of_text

Gestion des caractères des onglets

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 en utilisant le chmod commander. Modifiez les lignes en retrait pour vous assurer qu’elles ont un ou deux caractères de tabulation au début de la ligne plutôt qu’une série d’espaces.

#!/bin/bash

cat << _end_of_text
Your user name is: $(whoami)
  Your current working directory is: $PWD
    Your Bash version is: $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 premiers caractères de tabulation. Enregistrez cet exemple sous «heredoc-3.sh» et rendez-le exécutable.

#!/bin/bash

cat <<- _end_of_text
Your user name is: $(whoami)
  Your current working directory is: $PWD
    Your Bash version is: $BASH_VERSION
_end_of_text
./heredoc-3.sh

Les onglets sont ignorés. Cela peut sembler anodin, mais c’est une manière intéressante de gérer les onglets de début en raison des sections indentées des scripts.

Les boucles et autres constructions logiques sont généralement indentées. Si votre document ici est contenu dans une section indentée d’un script, en utilisant un tiret « -”Avec l’opérateur de redirection supprime les problèmes de formatage causés par les caractères de tabulation de début.

#!/bin/bash

if true; then
  cat <<- _limit_string
  Line 1 with a leading tab.
  Line 2 with a leading tab.
  Line 3 with a leading tab.
  _limit_string
fi

Redirection vers un fichier

La sortie de la commande utilisée avec le document here peut être redirigée dans un fichier. Utilisez le « >»(Créer le fichier) ou«>>»(Créer le fichier s’il n’existe pas, ajouter au fichier s’il existe) opérateurs de redirection 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

cat << _end_of_text > session.txt
Your user name is: $(whoami)
Your current working directory is: $PWD
Your Bash version is: $BASH_VERSION
_end_of_text
./heredoc-4.sh
cat session.text

Tuyauterie de la sortie vers une autre commande

La sortie de la commande utilisée dans un document here peut être redirigé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, dans sed. Nous voulons remplacer toutes les occurrences de la lettre «a» par la lettre «e».

Nommez ce script « heredoc-5.sh ».

#!/bin/bash

cat << _end_of_text | sed 's/a/e/g'
How
To
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 here peut être une fonction du 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 ensuite imprimées. Enregistrez ce script sous «heredoc-6.sh».

#!/bin/bash

# the set_car_details() function
set_car_details ()
{
read make
read model
read new_used
read delivery_collect
read location
read price
}

# The here document that passes the data to set_car_details()
set_car_details << _mars_rover_data
NASA
Perseverance Rover
Used
Collect
Mars (long,lat) 77.451865,18.445161
2.2 billion
_mars_rover_data

# Retrieve the vehicle details
echo "Make: $make"
echo "Model: $model"
echo "New or Used: $new_used"
echo "Delivery or Collection: $delivery_collect"
echo "Location: $location"
echo "Price $: $price"
./heredoc-6.sh

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

Créer et envoyer un e-mail

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

Cet exemple forme le script «heredoc-7.sh».

#!/bin/bash

article="Here Documents"

mail -s 'Workload status' dave << _project_report
User name: $(whoami)
Has completed assignment:
Article: $article
_project_report
./heredoc-7.sh

Il n’y a pas de sortie visible de ce script. Mais lorsque nous vérifions notre courrier, nous constatons que le courrier électronique a été composé, expédié et livré.

mail

Utilisation des documents Here 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 sale, vous serez invité à entrer 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 le -T (désactiver l’allocation de pseudo-terminal) car nous n’avons pas besoin d’un pseudo-terminal interactif pour nous être assigné.

Dans la section «travailler 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 utilisateur et un horodatage sont enregistrés dans un fichier texte.

#!/bin/bash

ssh -T dave@remote-pc.local << _remote_commands

# do some work in here

# update connection log
echo $USER "-" $(date) >> /home/dave/conn_log/script.log
_remote_commands

Lorsque nous exécutons la commande, nous sommes invités à entrer le mot de passe du compte sur le à distance l’ordinateur.

./heredoc-8.sh

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

Sur le à distance ordinateur, nous pouvons utiliser cat pour vérifier le journal de connexion:

cat conn_log/script.log

Chaque connexion est répertoriée pour nous.

Nom étrange, fonctionnalités intéressantes

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

★★★★★