Come utilizzare “Here Documents” in Bash su Linux

0
3

Una finestra di terminale su un computer Linux.
Fatmawati Achmad Zaenuri/Shutterstock

Lo strano nome “qui documenti” ti consente di utilizzare il reindirizzamento input/out all’interno degli script Bash su Linux. Sono un ottimo modo per automatizzare i comandi che devi eseguire su un computer remoto.

Qui Documenti

Molti comandi in Linux hanno nomi di due o tre lettere. Questo è in parte ciò che dà origine all’idea che Linux sia difficile da imparare e pieno di comandi arcani. Ma uno dei nomi più strani in Linux non è uno di quelli cripticamente brevi. I “documenti qui” non sono documenti, e non è nemmeno chiaro a cosa si riferisca il “qui”.

Sono un costrutto relativamente oscuro, ma sono utili. Ovviamente questo è Linux, quindi c’è più di un modo per scuoiare un gatto. Alcune delle funzionalità fornite da qui documenti possono essere riprodotte in altri modi. Questi metodi alternativi sono generalmente più complicati. Nella programmazione e nello scripting, “più complicato” significa anche “più incline ai bug” e che il tuo codice è più difficile da mantenere.

Dove qui i documenti eccellono davvero è nell’automazione dei comandi che si desidera inviare a un computer remoto da una connessione stabilita all’interno di uno script. Effettuare la connessione è facile, ma una volta stabilita la connessione, come “pompare” i comandi dallo script nella shell del computer remoto? Qui i documenti ti consentono di farlo in modo molto semplice.

Principi di base di Here Documents

La rappresentazione idiomatica di un documento here assomiglia a questa:

COMMAND << limit_string
 .
 .
text 
data
variables
.
.
limit_string
  • COMANDO: può essere qualsiasi comando Linux che accetta input reindirizzati. Notare la echo il comando non accetta l’input reindirizzato. Se hai bisogno di scrivere sullo schermo, puoi usare il cat comando, che fa.
  • <<: l’operatore di reindirizzamento.
  • stringa_limite: Questa è un’etichetta. Può essere quello che vuoi, purché non appaia nell’elenco dei dati che stai reindirizzando al comando. Viene utilizzato per contrassegnare la fine dell’elenco di testo, dati e variabili.
  • Elenco dati: Un elenco di dati da fornire al comando. Può contenere comandi, testo e variabili. Il contenuto dell’elenco dei dati viene immesso nel comando una riga alla volta fino a quando non viene incontrata _limit_string.
Annuncio pubblicitario

Probabilmente vedrai esempi di documenti qui che usano “EOF” come stringa limite. Non favoriamo questo approccio. Funziona, ma “EOF” significa “Fine del file”. A parte il raro caso in cui un documento principale è l’ultima cosa in un file di script, “EOF” viene utilizzato in modo errato.

Renderà i tuoi script molto più leggibili se usi una stringa limite che si riferisce a ciò che stai facendo. Se stai inviando una serie di comandi a un computer remoto tramite Secure Shell (SSH), una stringa limite chiamata qualcosa come “_remote_commands” avrebbe perfettamente senso. Non è necessario iniziarli con un carattere di sottolineatura “_” personaggio. Lo facciamo perché li contrassegna come qualcosa fuori dall’ordinario nel tuo copione.

Esempi semplici

Puoi usare qui i documenti sulla riga di comando e negli script. Quando digiti quanto segue in una finestra di terminale, vedrai un “>” richiesta di continuazione della riga ogni volta che si preme “Invio”. Quando si digita la stringa limite “_end_of_text” e si preme “Invio”, l’elenco dei siti Web viene passato a cat, e vengono visualizzati nella finestra del terminale.

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

Non è l’esercizio più utile, ma dimostra che non viene inviato nulla al comando fino a quando non viene raccolto l’intero elenco di dati e non viene incontrata la stringa limite. Il cat Il comando non riceve alcun input finché non si immette la stringa limite “_end_of_text” e si preme il tasto “Invio”.

Possiamo fare la stessa cosa in uno script. Digita o copia questo esempio in un editor, salva il file come “heredoc-1.sh” e chiudi l’editor.

#!/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

Mentre segui questo articolo, ogni volta che crei uno script, dovrai renderlo eseguibile prima che venga eseguito. In ogni caso, utilizzare il chmod comando. Sostituisci il nome dello script in ogni esempio con il nome dello script utilizzato qui.

chmod +x heredoc-1.sh

Annuncio pubblicitario

Questo script contiene due variabili di ambiente, $PWD e $BASH_VERSION. I nomi delle variabili di ambiente vengono sostituiti dai loro valori di dati, la directory di lavoro corrente e la versione di Bash, quando viene eseguito lo script.

Lo script usa anche sostituzione di comando sul whoami comando. Il nome del comando viene sostituito dal proprio output. L’output dell’intero script viene scritto nella finestra del terminale dal comando cat. Eseguiamo lo script chiamandolo per nome:

./heredoc-1.sh

Se modifichi lo script e inserisci la stringa limite nella prima riga del documento here tra virgolette ” " “, l’elenco dei dati viene passato al comando here document alla lettera. I nomi delle variabili vengono visualizzati al posto dei valori delle variabili e la sostituzione dei comandi non avrà luogo.

#!/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-1.sh

Gestire i caratteri delle schede

Per impostazione predefinita, i caratteri di tabulazione nell’elenco dei dati verranno conservati e scritti nella finestra del terminale. Copia e salva questo esempio come “heredoc-2.sh”. Rendilo eseguibile usando il chmod comando. Modifica le righe rientrate per assicurarti che abbiano uno o due caratteri di tabulazione all’inizio della riga anziché una serie di spazi.

#!/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

Le schede vengono scritte nella finestra del terminale.

Aggiungendo un trattino “-” all’operatore di reindirizzamento, il documento here ignorerà i caratteri di tabulazione iniziali. Salva questo esempio come “heredoc-3.sh” e rendilo eseguibile.

#!/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

Le schede vengono ignorate. Questo potrebbe sembrare banale, ma è un modo accurato per gestire le schede principali a causa delle sezioni rientrate degli script.

Annuncio pubblicitario

I cicli e altri costrutti logici sono generalmente rientrati. Se il tuo documento qui è contenuto in una sezione rientrata di uno script, usando un trattino “-” con l’operatore di reindirizzamento rimuove i problemi di formattazione causati dai caratteri di tabulazione iniziali.

#!/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

Reindirizzamento a un file

L’output del comando utilizzato con il documento here può essere reindirizzato in un file. Usa il “>” (crea il file) o “>>” (crea il file se non esiste, aggiungi al file se esiste) operatori di reindirizzamento dopo la stringa limite nella prima riga del documento here.

Questo script è “heredoc-4.sh”. Reindirizzerà il suo output a un file di testo chiamato “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

Convogliamento dell’output a un altro comando

L’output del comando utilizzato in un documento here può essere reindirizzato come input a un altro comando. Usa la pipa”|“operatore” dopo la stringa limite nella prima riga del documento here. Invieremo l’output dal comando here document, cat, in sed. Vogliamo sostituire tutte le occorrenze della lettera “a” con la lettera “e”.

Denominare questo 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” viene corretto in “Geek”.

Invio di parametri a una funzione

Il comando utilizzato con un documento here può essere una funzione nello script.

Questo script passa alcuni dati del veicolo in una funzione. La funzione legge i dati come se fossero stati digitati da un utente. I valori delle variabili vengono quindi stampati. Salva questo script come “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

I dettagli del veicolo vengono scritti nella finestra del terminale.

Creazione e invio di un’e-mail

Possiamo usare un documento qui per comporre e inviare un’e-mail. Nota che possiamo passare i parametri al comando davanti all’operatore di reindirizzamento. Stiamo usando Linux mail comando per inviare un messaggio di posta elettronica tramite il sistema di posta locale all’account utente denominato “dave”. Il -s (oggetto) ci consente di specificare l’oggetto dell’e-mail.

Questo esempio forma lo 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

Annuncio pubblicitario

Non c’è output visibile da questo script. Ma quando controlliamo la nostra posta, vediamo che l’e-mail è stata composta, spedita e consegnata.

mail

Utilizzo dei documenti qui con SSH

Qui i documenti sono un modo potente e conveniente per eseguire alcuni comandi su un computer remoto una volta stabilita una connessione SSH. Se hai impostato chiavi SSH tra i due computer, il processo di accesso sarà completamente automatico. In questo esempio veloce e sporco, ti verrà richiesta la password per l’account utente sul computer remoto.

Questo script è “heredoc-8.sh”. Ci collegheremo a un computer remoto chiamato “remote-pc”. L’account utente si chiama “dave”. Stiamo usando il -T (disabilita allocazione pseudo-terminale) perché non è necessario che ci venga assegnato uno pseudo-terminale interattivo.

Nella sezione “fai un po’ di lavoro qui” dello script, potremmo passare un elenco di comandi e questi verrebbero eseguiti sul computer remoto. Certo, potresti semplicemente chiamare uno script che era sul computer remoto. Lo script remoto potrebbe contenere tutti i comandi e le routine che si desidera eseguire.

Tutto ciò che il nostro script, heredoc-8.sh, farà è aggiornare un registro di connessione sul computer remoto. L’account utente e l’ora e la data vengono registrati in un file di testo.

#!/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
Annuncio pubblicitario

Quando eseguiamo il comando, ci viene richiesta la password per l’account sul a distanza computer.

./heredoc-8.sh

Vengono visualizzate alcune informazioni sul computer remoto e si torna al prompt dei comandi.

Sul a distanza computer, possiamo usare cat per controllare il registro di connessione:

cat conn_log/script.log

Ogni connessione è elencata per noi.

RELAZIONATO: Come creare e installare chiavi SSH dalla shell Linux

Nome strano, caratteristiche pulite

Qui i documenti sono bizzarri ma potenti, specialmente se usati per inviare comandi a un computer remoto. Sarebbe semplice scrivere una routine di backup usando rsync. Lo script potrebbe quindi connettersi al computer remoto, controllare lo spazio di archiviazione rimanente e inviare un’e-mail di avviso se lo spazio si stava esaurendo.

RELAZIONATO: Come eseguire il backup del sistema Linux Linux

LEAVE A REPLY

Please enter your comment!
Please enter your name here