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
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.
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.
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
:
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:
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:
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