Les "voici des documents" étrangement nommés vous permettent d'utiliser la redirection d'entrée / sortie à l'intérieur des scripts Bash sous Linux. Ils sont un excellent moyen d'automatiser les commandes dont vous avez besoin pour fonctionner sur un ordinateur distant.
Voici des documents
De nombreuses commandes de Linux ont deux ou trois noms de lettres. C'est en partie ce qui donne lieu à la notion que Linux est difficile à apprendre et plein de commandes d'arcanes. Mais l'un des noms les plus étranges de Linux n'est pas l'un des courts cryptiquement courts. "Ici, les documents" ne sont pas des documents, et il n'est pas vraiment clair ce que le "ici" se réfère non plus.
Ils sont une construction relativement obscure, mais elles sont utiles. Bien sûr, c'est Linux, donc il y a plus d'une façon de cuire un chat. Certaines des fonctionnalités fournies par ici des documents peuvent être reproduites d'une autre manière. Ces méthodes alternatives sont généralement plus compliquées. Dans la programmation et les scripts, «plus compliqué» signifie également «plus sujette à des bugs» et que votre code est plus difficile à maintenir.
Où ici documents vraiment Excel se trouve dans l'automatisation des commandes que vous souhaitez envoyer à un ordinateur distant à partir d'une connexion établie à partir d'un script. Rendre la connexion est facile, mais une fois la connexion effectuée, comment "pomper" vos commandes de votre script dans la coquille sur l'ordinateur distant? Ici, les documents vous permettent de faire cela très simplement.
Principes de base des documents ici
La représentation idiomatique d'un document ici ressemble à ceci:
Command & LT; & lt; limite_string . . texte Les données variables . . limit_string
-
COMMANDER
: Ceci peut être une commande Linux qui accepte une entrée redirigée. Noter la
échocommander n'accepte pas l'entrée redirigée . Si vous devez écrire à l'écran, vous pouvez utiliser lechatcommander, qui fait . - & lt; & lt; : L'opérateur de redirection.
- limite_string : C'est une étiquette. Cela peut être ce que vous voulez aussi longtemps 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 à être nourries à 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 le _limit_string soit rencontré.
Vous verrez probablement des exemples de documents ici qui utilisent "EOF" comme chaîne limite. Nous ne favorisons pas cette approche. Cela fonctionne, mais "EOF" signifie "fin du fichier". Outre le cas rare où un document à domicile est la dernière chose dans un fichier de script, "EOF" est utilisé à tort.
Il 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 sur
Enveloppe de protection
(SSH), une chaîne limite appelée quelque chose comme "_remote_commands" aurait un sens parfait. Vous n'avez pas besoin de les commencer avec un soulignement "
_
" personnage. Nous faisons cela parce que cela les marquons comme quelque chose hors de l'ordinaire dans votre script.
Exemples simples
Vous pouvez utiliser ici des documents sur la ligne de commande et dans les scripts. Lorsque vous tapez les éléments suivants dans une fenêtre de terminal, vous verrez un "
& gt;
"Invite de continuation de la ligne chaque fois que vous appuyez sur" Entrée ". Lorsque vous tapez "_end_of_text" limiter la chaîne et appuyez sur "Entrée", la liste des sites Web est transmise à
chat,
et ils sont affichés dans la fenêtre du terminal.
CAT & LT; & LT; _end_of_text Comment geek Critiquer geek Lifesavvys Cloudsavvy il Menacer _end_of_text
Ce n'est pas le plus intéressant des exercices, mais il démontre que rien n'est envoyé à la commande jusqu'à ce que la liste complète des données soit rassemblée et que la chaîne limite soit rencontrée. Les
chat
La commande ne reçoit aucune entrée avant de saisir la chaîne de limite "_end_of_text" et appuyez 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 comme «heredoc-1.sh» et fermez l'éditeur.
#! / Bin / bash chat & lt; & lt; "_end_of_text" Votre nom d'utilisateur est: $ (whoami) Votre répertoire de travail actuel est: $ pwd Votre version Bash est: $ Bash_version _end_of_text
Comme vous suivez cet article, chaque fois que vous créez un script, vous devrez
le rendre exécutable
avant qu'il va courir. Dans chaque cas,
Utilisez le
chmod
commander
. Substituez le nom du script dans chaque exemple pour le nom de script utilisé ici.
CHMOD + x HEREDOC-1.SH
Ce script contient deux variables d'environnement,
$ Pwd
et
$ Bash_version
. Les noms de variable 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
au
les
qui suis je
commander
. Le nom de la commande est remplacé par sa propre sortie. La sortie de l'ensemble du script est écrite sur la fenêtre du terminal par la commande CAT. Nous exécutons le script en l'appelant par nom:
./ Heredoc-1.Sh
Si vous modifiez le script et enveloppez la chaîne de limite dans la première ligne du document ici dans les guillemets »
"
", La liste de données est transmise à la commande de document ici Verbatim. Les noms de variables sont affichés au lieu de valeurs variables et la substitution de commande ne se produira pas.
#! / Bin / bash CAT & LT; & LT; - "_end_of_text" Votre nom d'utilisateur est: $ (whoami) Votre répertoire de travail actuel est: $ pwd Votre version Bash est: $ Bash_version _end_of_text
Manipulation des caractères d'onglet
Par défaut, les caractères d'onglet de votre liste de données seront conservés et écrits dans la fenêtre du terminal. Copier et enregistrer cet exemple comme "Heredoc-2.sh". Rendre exécutable en utilisant le
chmod
commander. Modifiez les lignes en retrait pour vous assurer qu'elles disposent d'un ou de deux caractères d'onglet au début de la ligne plutôt qu'à une série d'espaces.
#! / Bin / bash
chat & lt; & lt; _end_of_text
Votre nom d'utilisateur est: $ (whoami)
Votre répertoire de travail actuel est: $ pwd
Votre version 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 principaux caractères d'onglet. Enregistrez cet exemple comme «Heredoc-3sh» et le rendre exécutable.
#! / Bin / bash
chat & lt; & lt; - _end_of_text
Votre nom d'utilisateur est: $ (whoami)
Votre répertoire de travail actuel est: $ pwd
Votre version Bash est: $ Bash_version
_end_of_text
./ Heredoc-3.sh
Les onglets sont ignorés. Cela peut sembler trivial, mais il est une solution unique de faire face à des onglets de conduite en raison de sections en retrait des scripts.
Les boucles et autres constructions logiques sont généralement en retrait. Si votre document ici est contenu dans une section en retrait d'un script, en utilisant un tiret »
-
"L'opérateur de redirection supprime les problèmes de formatage causés par les principaux caractères d'onglet.
#! / Bin / bash si vrai; alors CAT & LT; & lt; - _Limit_string Ligne 1 avec un onglet de premier plan. Ligne 2 avec un onglet de premier plan. Ligne 3 avec un onglet de premier plan. _limit_string fi
Redirection d'un fichier
La sortie de la commande utilisée avec le document ici peut être redirigée dans un fichier. Utilisez le "
& gt;
"(Créez le fichier) ou"
& gt; & gt;
"(Créez le fichier s'il n'existe pas, appendez-le au fichier si nécessaire) des opérateurs de redirection
après
la chaîne limite dans la première ligne du document ici.
Ce script est "Heredoc-4.sh." Il redirigera sa sortie dans un fichier texte appelé "session.txt".
#! / Bin / bash chat & lt; & lt; _end_of_text & gt; session.txt Votre nom d'utilisateur est: $ (whoami) Votre répertoire de travail actuel est: $ pwd Votre version Bash est: $ Bash_version _end_of_text
./ Heredoc-4.Sh
CAT SESSION.Text
Tuyauterie de la sortie à une autre commande
La sortie de la commande utilisée dans un document ici peut être canalisée comme entrée à une autre commande. Utilisation
le tuyau "
|
"Opérateur
après
la chaîne limite dans la première ligne du document ici. Nous allons pipi la sortie de la commande de document ICI,
chat
, dans
sed
. Nous voulons
substituer toutes les occurrences
de la lettre « a » par la lettre « e ».
Nommez ce script « heredoc-5.sh. »
#! / Bin / bash chat & lt; & lt; _end_of_text | sed 's / a / e / g' Comment À Gaak _end_of_text
./ heredoc-5.sh
« Gaak » est corrigée à « Geek ».
L'envoi des paramètres à une fonction
La commande qui est utilisé avec un document en peut être une fonction dans le script.
Ce script passe des données du véhicule en fonction. La fonction lit les données comme si elle avait été tapé par un utilisateur. Les valeurs des variables sont ensuite imprimées. Enregistrer ce script comme « heredoc-6.sh ».
#! / Bin / bash
# la fonction set_car_details ()
set_car_details ()
{
lecture make
modèle de lecture
lire new_used
lecture delivery_collect
emplacement lecture
prix lecture
}
# Le document ici qui transmet les données à set_car_details ()
set_car_details & lt; & lt; _mars_rover_data
Nasa
persévérance Rover
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 "Marque: $ make"
echo "Modèle: modèle $"
echo "Neuf ou d'occasion: $ new_used"
echo "Livraison ou Collection: delivery_collect de $"
echo "Situation: A $"
echo "Prix $ \: $ prix"
./ heredoc-6.sh
Les détails du véhicule sont écrites 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 en face de l'opérateur de redirection. Étaient
en utilisant Linux
courrier
commander
à
envoyer un e-mail via le système de courrier local
au compte utilisateur appelé « dave ». Les
-s
(Sous réserve) l'option permet de préciser l'objet de l'e-mail.
Cet exemple de script formes « heredoc-7.sh. »
#! / Bin / bash article = "Documents en ligne" courrier de l'état de charge de travail '-s dave & lt; & lt; _rapport de projet Nom d'utilisateur: $ (whoami) A mission terminée: Article: article $ _project_report
./ heredoc-7.sh
Il n'y a pas de sortie visible de ce script. Mais quand nous vérifions notre courrier, nous voyons que le courriel a été composé, expédié et livré.
courrier
À partir de documents ici avec SSH
Ici, les documents sont un moyen puissant et pratique pour exécuter des commandes sur un ordinateur distant une fois une connexion SSH a été mis en place. Si vous avez mis en place les 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 utilisateur sur l'ordinateur distant.
Ce script est « heredoc-8.sh ». Nous allons connecter à un ordinateur distant appelé « distance-pc ». Le compte utilisateur est appelé « dave ». Nous utilisons le
-T
(Désactiver l'allocation pseudo-terminal) option, car on n'a pas besoin d'un pseudo-terminal interactif à qui nous est assignée.
Dans la section « faire un travail ici » du script, nous pourrions passer une liste de commandes, et ceux-ci seraient exécutés sur l'ordinateur distant. Bien sûr, vous pouvez simplement appeler un script qui était sur l'ordinateur distant. Le script distant peut contenir toutes les commandes et les routines que vous voulez avoir exécuté.
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 et la date sont enregistrées dans un fichier texte.
#! / Bin / bash ssh -T [email protected] & lt; & lt; _remote_commands # Faire quelques travaux ici # Connexion mise à jour log echo $ USER "-" $ (date) & gt; & gt; /home/dave/conn_log/script.log _remote_commands
Quand nous courons la commande, nous demande le mot de passe pour le compte de la à distance ordinateur.
./ heredoc-8.sh
Quelques informations sur l'ordinateur distant est affiché, et nous sommes retourné à l'invite de commande.
Sur le
à distance
ordinateur, nous pouvons utiliser
chat
pour vérifier le journal de connexion:
chat conn_log / script.log
Chaque connexion est répertorié pour nous.
EN RELATION: Comment créer et installer des touches SSH à partir de la coque Linux
Nom étrange, Caractéristiques Neat
Les documents sont originaires mais puissants, en particulier lorsqu'ils sont utilisés pour envoyer des commandes à un ordinateur distant. Ce serait une simple question pour script une routine de sauvegarde utilisant
rsync
. Le script pourrait ensuite se connecter à l'ordinateur distant, vérifier l'espace de stockage restant et envoyer un email d'alerte si l'espace devait être faible.
EN RELATION: Comment sauvegarder votre système Linux avec RSYNC