Noções básicas de automação Bash e scripts (papel 3)

Conteúdo

Shutterstock / Mopic

Nesta postagem final de nossa série de noções básicas de automação e script bash em 3 partes, vamos explorar a depuração de script, executando scripts como um procedimento em segundo plano e importando outros scripts usando o comando de origem.

Noções básicas de automação Bash e scripts

Se você quer começar do começo, lea nuestro post Bash Automation and Scripting Basics Part 1. Esta postagem final em nossa série de três partes sobre automação do bash e noções básicas de script discutirá a execução de scripts como um procedimento de segundo plano..

Também queremos depurar nossos scripts rapidamente, com o mínimo de complicações e resultados de ponta.. Isso pode ser feito usando uma função de rastreamento muito útil, construído diretamente no shell bash. Veremos isso no segundo tópico. Você também pode ficar de olho em nosso próximo post sobre o shellcheck relacionado.

E para terminar, vamos explorar como executar scripts como um procedimento em segundo plano. Embora isso possa fornecer benefícios imediatos modestos, como iniciar várias tarefas ao mesmo tempo, também estabelece algumas das bases para scripts multithread mais avançados posteriores.

Depuração de script

Depurar um script no bash não precisa ser difícil!! Fique de olho no portal da web CloudSavvyIT, pois em breve revisaremos a ferramenta de depuração de verificação de shell mais abrangente para Bash, mas no momento eu gostaria de apresentar a você uma ótima maneira de depurar scripts Shell de uma forma simples e fácil de entender.

Dentro da concha de Bash, que afinal é um “simples” binário rodando em sua máquina, Em outras palavras, a bash trilhas, uma opção é fornecida (-x) naquela, de acordo com man bash (executando isso em seu terminal irá mostrar um Bash manual) é descrito como Comandos de impressão e seus argumentos à medida que são executados¡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" -o "${B}" == "1" ]; then 
  echo "One ('1') was definitely stored in either the variable A, or the variable B"
  saída 0
else
  echo "Afirmar: could not locate the value '1' in the variables A and B"
  saída 1
ser

Un pequeño script de Bash con un error

Aquí comprobamos las variables A e B contra el valor 1. a -o modismo en el if declaración significa OR, Em outras palavras, la primera parte (A, o melhor AA aqui está 1) es cierto, o la segunda parte (B isto é 1) es cierto y, en tal caso, se logra el éxito.

A saída do script será a asserção programada e o programa será encerrado com um código de saída de 1, o que geralmente significa que houve um erro. Se o script funcionou corretamente, uma mensagem de confirmação seria exibida e o script terminaria com um código de saída de 0, o que geralmente significa que tudo o que foi planejado para ser feito com o script ou o utilitário foi bem-sucedido.

Então, Por que o script está rodando em asserção? Você já deve ter notado que a variável A Eu encontrei um erro de digitação em nosso if demonstração, registrado no código como AA: um inseto! Poderíamos ir e verificar o roteiro, e se for tão curto e simples como o mostrado aqui, o erro seria encontrado rapidamente. Mas para um show 5000 linhas, A resposta não é tão simples, especialmente se você usar vários tópicos, subcamadas complexas, etc.

Nós depuramos isso agora com o -x opção para Bash. Você deve se lembrar da segunda parte de nosso curso Bash Scripting and Automation Basics que um subshell pode ser iniciado usando um $( ... ) conjunto de expressões idiomáticas. Também pode ser iniciado simplesmente digitando bash, o para este caso bash -x dentro de nossa concha superior. Nesta circunstância, vamos executar o script dentro de nosso subshell Bash, com ele -x opção de observar o que acontece passo a passo.

Executando nosso script de pequeno porte com bash -x

Então, nós executamos bash -x ./test_debugging.sh e observe que a próxima verificação condicional está ocorrendo: '[' '' == 1 -o 2 == 1 ']'. Notamos que algo está errado: o valor de 2 está sendo comparado com 1 na segunda parte de nossa verificação condicional, mas o que está acontecendo na primeira parte? Algo está sendo comparado a 1, mas isso algo Está … vazio (conforme indicado pela string vazia '')!

Em seguida, verificamos nosso script porque aquele lugar vazio está lá e porque ele não foi preenchido com o valor de nosso A variável. Rapidamente percebemos o AA ao invés de A erro, conserte o erro e o script agora funciona bem.

O script corrigido com o bug corrigido.

Algo muito legal para lembrar ao usar bash -x é que você pode tee (leia isso como 'Cópia de’) a saída do comando Bash redirecionando stderr (a saída de erro) um stdout (saída padrão) e capturar o mesmo com tee:

Usando o tee em combinação com bash -x

Aqui estamos executando nosso script corrigido e redirecionando a saída de erro (bash -x envie todas as suas informações de saída de depuração para stderr, a saída de erro padrão, sim, um stdout) usando 2>&1 (que redireciona nossa saída stderr para stdout – nossa saída padrão – em seu lugar). Em seguida, capturamos stdout usando tee e isso salvará a saída no arquivo especificado, a saber bash_-x_output.txt.

Isso torna possível para um desenvolvedor bash revisar lentamente, em um formato passo a passo, seu código escrito. Especialmente quando os programas ficam complexos, tem funções, tornar-se multithread, iniciar processos em segundo plano, etc., esta forma de depuração pode ser muito valiosa. Como exemplo, Eu costumo usar bash -x cerca de uma vez a cada quinze dias para depurar scripts complexos.

Execução de scripts como processos em segundo plano

Ejecutar un script como procedimiento en segundo plano es sencillo: simplemente agregue & al final del nombre del script (con un espacio entre ellos). Definir background.sh Como 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 imediatamente o prompt de comando retornará. Usamos isso aqui, especificando o seguinte comando (sleep 1) logo depois & linguagem de fundo, que também termina aquele comando com um único comando / exclusivo (Em outras palavras, sleep 1 é um comando absolutamente novo).

Também encerramos nosso sleep 1 comando com um frequente fim do comando Idioma Bash, após o qual vamos executar um echo que o sleep 1 está completo / feito. A seguir, vamos ver o que acontece na execução desta linha.

Imediatamente, nosso procedimento / script em segundo plano (background.sh) inicia e funcionará por cerca de 2 segundos. O PID (identificador de procedimento) do procedimento de fundo iniciado é exibido visualmente (Em outras palavras, 773183 para o nosso primeiro[1]) procedimento de fundo, e este PID será diferente cada vez que você iniciar um programa / procedimento de fundo), e o nosso sleep 1 (a próxima instrução para execução) agora pode ser executado visto que o outro programa retornou nossa mensagem (mesmo que não seja mostrado diretamente aqui, isso é o que acontece quando você inicia um procedimento em segundo plano; obtém imediatamente o prompt de comando de volta).

a sleep 1 começa (com ele sleep 2 ou mais exatamente o background.sh O script ainda está sendo executado em segundo plano, como um procedimento diferente, em uma subcamada iniciada sob esta camada de nível superior ou superior) e termina depois 1 segundo. Depois disso, nosso echo corre, nos mostrando o sleep 1 Esta completo. Um segundo depois, nosso background.sh o procedimento completa sua espera por 2 segundos e termina.

Não vemos se ele terminou, pois o shell Bash espera alguma interação para nos mostrar mensagens de status. Por isso, assim que pressionamos enter, a qualquer momento após o sono de dois segundos terminar, veremos o término do procedimento de segundo plano como um [1]+ Done ./background.sh mensagem de status. Se você voltar para a segunda parte de nossa minissérie, também é possível ver como poderíamos ter usado wait aqui para esperar pela conclusão / término do procedimento de fundo PID. Ele também destaca quantos comandos e utilitários podem ser usados ​​combinatoriamente no Bash.

Importando scripts 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) executável (usando chmod +x testsource.sh), pero no el segundo script (na realidade, desarmamos la bandera ejecutable para mostrar claramente que esto funciona usando chmod -x sobre mysource.sh), el segundo script se sigue llamando correctamente como consecuencia de la source comando, y se ejecuta como parte del testsource.sh texto:

Obtendo um script com o comando de origem do Bash

No mysource.sh roteiro, nós definimos a variável MYVAR para Hello CloudSavvyIT Readers!. Este script é obtido posteriormente em testsource.sh script usando instrução source mysource.sh. Isso vai causar mysource.sh para ser executado naquele ponto, o código, e quando estiver completo, a testsource.sh O script continuará a ser executado, mesmo que qualquer coisa estabelecida no mysource.sh será retido (pense nisso como de outro script lembrar a operação disso mais facilmente).

Em resumo

Damos uma olhada na depuração de scripts usando bash -x para mostrar todos os comandos executados. Também exploramos como executar um script como procedimento em segundo plano e aprendemos como podemos importar scripts usando o código-fonte.. Obrigado por estar atento a esta série de 3 partes, Da qual esta foi a postagem final!

Se você estiver interessado em aprender mais sobre o Bash, Que tal dar uma olhada em nossos posts ou no Primer: Bash Loops: para, enquanto e até, Testes condicionais em bash: E se, então, outro, Funções e variáveis ​​locais elif e Bash

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.