Nozioni di base sull'automazione e sugli script di Bash (parte 3)

Contenuti

Shutterstock / Mopic

In questo post finale della nostra serie di basi in 3 parti di automazione e scripting bash, esploreremo il debug degli script, esecuzione di script come procedura in background e importazione di altri script utilizzando il comando source.

Nozioni di base sull'automazione e sugli script di Bash

Se vuoi iniziare dall'inizio, lea nuestro post Bash Automation and Scripting Basics Part 1. Questo post finale della nostra serie in tre parti sull'automazione di bash e le basi dello scripting discuterà l'esecuzione degli script come procedura in background..

Vogliamo anche eseguire rapidamente il debug dei nostri script con un minimo di complicazioni e risultati di alto livello.. Questo può essere fatto usando una funzione di traccia molto utile, integrato direttamente nella shell bash. Lo vedremo nel secondo topic. Puoi anche tenere d'occhio il nostro prossimo post sul relativo shellcheck.

E per finire esploreremo come eseguire gli script come procedura in background. Sebbene ciò possa fornire modesti benefici immediati, come avviare più attività contemporaneamente, pone anche alcune delle basi per successivi script multithread più avanzati.

Debug degli script

Il debug di uno script in bash non deve essere difficile!! Tieni d'occhio il portale web CloudSavvyIT, poiché esamineremo presto lo strumento di debug shellcheck più completo per Bash, ma per il momento vorrei presentarti un ottimo modo per eseguire il debug degli script Shell in un modo semplice e facile da capire.

Dentro il guscio di Bash, che dopo tutto è un “semplice” binario in esecuzione sulla tua macchina, In altre parole, il bash binario, viene fornita un'opzione (-x) Quello, secondo man bash (l'esecuzione di questo nel tuo terminale mostrerà un Bash manuale) è descritto come Stampa i comandi e i loro argomenti mentre vengono eseguiti¡Y esto es exactamente lo que hace! ¿Cómo ayudará esto con la depuración? Eche un vistazo al siguiente ejemplo:

#!/bin/bash

A=1
B=2
if [ "${aa}" == "1" -oh "${B}" == "1" ]; then 
  echo "One ('1') was definitely stored in either the variable A, or the variable B"
  Uscita 0
else
  echo "Affermare: could not locate the value '1' in the variables A and B"
  Uscita 1
essere

Un pequeño script de Bash con un error

Aquí comprobamos las variables A e B contra el valor 1. il -o modismo en el if declaración significa OR, In altre parole, la primera parte (A, o meglio AA Ecco qui 1) es cierto, o la segunda parte (B è 1) es cierto y, in quel caso, se logra el éxito.

L'output dello script sarà l'asserzione pianificata e il programma terminerà con un codice di uscita di 1, il che generalmente significa che c'è stato un errore. Se lo script avesse funzionato correttamente, verrebbe visualizzato un messaggio di conferma e lo script terminerebbe con un codice di uscita di 0, il che generalmente significa che tutto ciò che doveva essere fatto con lo script o l'utilità ha avuto successo.

Quindi, Perché lo script è in esecuzione sull'asserzione?? Potresti aver già notato che la variabile A Ho trovato un errore di battitura nel nostro if dichiarazione, registrato nel codice as AA: un insetto! Potremmo andare a controllare il copione, e se è così breve e semplice come quello mostrato qui, l'errore sarebbe stato trovato rapidamente. Ma per uno spettacolo 5000 Linee, La risposta non è così semplice, soprattutto se usi più thread, sottolivelli complessi, eccetera.

Eseguiamo il debug ora con il -x opzione per Bash. Potresti ricordare dalla seconda parte del nostro corso Bash Scripting and Automation Basics che una subshell può essere avviata utilizzando un $( ... ) insieme di modi di dire. Può anche essere avviato semplicemente digitando bash, o per questo caso bash -x dentro il nostro guscio superiore. In questa circostanza, eseguiremo lo script all'interno della nostra subshell Bash, con il -x possibilità di osservare cosa succede passo dopo passo.

Esecuzione del nostro script smalls con bash -x

Quindi eseguiamo bash -x ./test_debugging.sh e nota che è in corso il prossimo controllo condizionale: '[' '' == 1 -o 2 == 1 ']'. Notiamo che qualcosa non va: il valore di 2 viene paragonato a 1 nella seconda parte del nostro controllo condizionale, ma cosa sta succedendo nella prima parte? Qualcosa viene paragonato a 1, ma quello qualcosa è … vuoto (come indicato dalla stringa vuota '')!

Quindi controlliamo il nostro script perché quel posto vuoto è lì e perché non è stato riempito con il valore del nostro A variabile. Ci rendiamo subito conto che AA invece di A errore, correggi l'errore e lo script ora funziona correttamente.

Lo script è stato corretto con il bug corretto.

Qualcosa di veramente bello da ricordare quando si utilizza bash -x è che puoi? tee (leggi questo like 'Copia’) l'output del comando Bash che reindirizza stderr (l'uscita di errore) uno stdout (uscita standard) e catturando lo stesso con tee:

Utilizzo di tee in combinazione con bash -x

Qui stiamo eseguendo il nostro script fisso e stiamo reindirizzando l'output dell'errore (bash -x invia tutto il tuo output di debug informativo a stderr, l'output dell'errore standard, y no uno stdout) usando 2>&1 (che reindirizza il nostro output stderr a stdout – la nostra produzione standard – Invece). Quindi acquisiamo lo stdout usando tee e questo salverà l'output nel file specificato, vale a dire bash_-x_output.txt.

Ciò consente a uno sviluppatore bash di rivedere lentamente, in un formato passo dopo passo, il tuo codice scritto. Soprattutto quando i programmi diventano complessi, avere funzioni, diventa multithread, avviare processi in background, eccetera., questa forma di debug può essere molto preziosa. Come esempio, tendo a usare bash -x circa una volta ogni quindici giorni per eseguire il debug di script complessi.

Esecuzione di script come processi in background

Ejecutar un script como procedimiento en segundo plano es sencillo: basta aggiungere & al final del nombre del script (con un espacio entre ellos). Definire background.sh come segue:

#!/bin/bash

sleep 2

Después lo iniciamos de la próxima manera, para resaltar el hecho de que se está ejecutando en segundo plano:

Flujo de varios comandos Bash con uno de esos comandos como proceso en segundo plano

Lo que podemos ver que sucede aquí es como sigue: background.sh El script se inicia en segundo plano (dado el & adjunto al nombre del script con un espacio), e immediatamente tornerà il prompt dei comandi. Lo usiamo qui specificando il seguente comando (sleep 1) subito dopo & lingua di sottofondo, che termina anche quel comando con un singolo comando / unico (In altre parole, sleep 1 è un comando assolutamente nuovo).

Chiudiamo anche il nostro sleep 1 comando con un frequente fine del comando idioma Bash, dopo di che eseguiremo un echo che lui sleep 1 è completo / fatto. Prossimo, vediamo cosa succede nell'esecuzione di questa riga.

Subito, la nostra procedura / sceneggiatura in sottofondo (background.sh) si avvia e durerà per circa 2 secondi. Il PID (identificatore di procedura) della procedura in background avviata viene visualizzata visivamente (In altre parole, 773183 per il nostro primo[1]) procedura in background, e questo PID sarà diverso ogni volta che avvii un programma / procedura in background), e il nostro sleep 1 (la prossima istruzione per l'esecuzione) ora può essere eseguito poiché l'altro programma ha restituito il nostro messaggio (anche se non è mostrato direttamente qui, ecco cosa succede quando avvii una procedura in background; ottiene immediatamente il prompt dei comandi indietro).

il sleep 1 inizia (con il sleep 2 o più esattamente il background.sh Lo script è ancora in esecuzione in background, come una procedura diversa, in un sottolivello iniziato sotto questo livello superiore o superiore) e finisce dopo 1 secondo. Dopo questo nostro echo corre, mostrandoci il sleep 1 È completo. Un secondo dopo, Nostro background.sh la procedura completa la tua attesa 2 secondi e finisce.

Non vediamo che è finito poiché la shell Bash si aspetta che ci mostri una certa interazione messaggi di stato. Perché, non appena premiamo invio, in qualsiasi momento dopo la fine del sonno di due secondi, vedremo la conclusione della procedura in background come a [1]+ Done ./background.sh messaggio di stato. Se torni alla seconda parte della nostra miniserie, è anche possibile vedere come avremmo potuto usare wait qui in attesa del completamento / procedura in background terminazione PID. Evidenzia anche quanti comandi e utilità possono essere usati in modo combinatorio in Bash.

Importare gli script usando fonte

La importación de otro script se puede hacer fácilmente usando Bash source comando. Considere el siguiente guión testsource.sh:

#!/bin/bash

source mysource.sh

echo "${MYVAR}"

Y el emparejamiento mysource.sh:

#!/bin/bash

MYVAR="Hello CloudSavvyIT Readers!"

Si simplemente hacemos el primer script (testsource.sh) eseguibile (usando chmod +x testsource.sh), pero no el segundo script (in realtà, desarmamos la bandera ejecutable para mostrar claramente que esto funciona usando chmod -x su mysource.sh), el segundo script se sigue llamando correctamente como consecuencia de la source comando, y se ejecuta como parte del testsource.sh testo:

Obtención de un script con el comando de origen Bash

In mysource.sh sceneggiatura, impostiamo la variabile MYVAR per Hello CloudSavvyIT Readers!. Questo script è ottenuto in seguito da testsource.sh script usando le istruzioni source mysource.sh. Questo causerà mysource.sh da eseguire a quel punto il codice, e quando è completo, il testsource.sh Lo script continuerà a essere eseguito, anche se nulla stabilito nel mysource.sh sarà trattenuto (pensa a questo come da un altro script per ricordare più facilmente il funzionamento di questo).

In sintesi

Diamo un'occhiata agli script di debug usando bash -x per mostrare tutti i comandi eseguiti. Abbiamo anche esplorato come eseguire uno script come procedura in background e abbiamo appreso come importare script utilizzando il codice sorgente.. Grazie per essere stato attento a questa serie di 3 parti, Di cui questo era l'ultimo post!

Se sei interessato a saperne di più su Bash, Che ne dici di controllare i nostri post o Primer?: Bash Loop: per, mentre e fino a, Test condizionali in bash: Se, poi, altro, elif e Bash Funzioni e variabili locali

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.