Comment utiliser «Here Documents» dans Bash sous Linux
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.
Sommaire
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 lecat
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é.
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.