Como rastrear a execução de comandos no script de shell com rastreamento de shell

Como rastrear a execução de comandos no script de shell com rastreamento de shell

Neste artigo da série de depuração de scripts Shell, explicaremos o terceiro modo de depuração de scripts do shell, que é rastreamento de conchas e examinar alguns exemplos para demonstrar como funciona e como pode ser usado.

A parte anterior desta série lança claramente os outros dois modos de depuração de scripts de shell: modo verboso e Verificação de sintaxe modo com exemplos fáceis de entender sobre como ativar a depuração do script de shell nesses modos.

  1. Como ativar o modo de depuração do script de shell no Linux - Parte 1
  2. Como executar o modo de depuração de verificação de sintaxe em scripts de shell - Parte 2

O rastreamento da concha significa simplesmente rastrear a execução dos comandos em um script de shell. Para ligar o rastreamento da concha, use o -x opção de depuração.

Isso instrui o shell a exibir todos os comandos e seus argumentos no terminal enquanto são executados.

Vamos usar o sys_info.sh script de shell abaixo, que imprime brevemente a data e hora do sistema, o número de usuários conectados e o tempo de atividade do sistema. No entanto, ele contém erros de sintaxe que precisamos encontrar e corrigir.

#!/bin/bash #script para imprimir breves informações do sistema root_id = "0" date = "date" no_users = "Who | wc -l" uptime = "uptime" check_root () if ["$ uid" -ne "$ root_id "]; então eco "você não tem permissão para executar este programa!"Exit 1; print_sys_info () echo" Horário do sistema: $ date "echo" Número de usuários: $ NO_USERS "ECHO" System UpTime: $ UpTime check_root print_sys_info Exit 0 

Salve o arquivo e faça o script executável. O script só pode ser executado pela raiz, portanto, empregue o comando sudo para executá -lo como abaixo:

$ chmod +x sys_info.sh $ sudo bash -x sys_info.sh 
Rastreamento de shell - mostre erro no script

A partir da saída acima, podemos observar que, um comando é executado primeiro antes de sua saída ser substituída como o valor de uma variável.

Por exemplo, o data foi executado pela primeira vez e a sua saída foi substituída como o valor da variável DATA.

Podemos executar a verificação da sintaxe para exibir apenas os erros de sintaxe da seguinte forma:

$ sudo bash -n sys_info.sh 
Verificação de sintaxe no script

Se olharmos para o script de shell criticamente, perceberemos que o If Declaração está faltando um fechamento fi palavra. Portanto, vamos adicioná -lo e o novo script agora deve parecer abaixo:

#!/bin/bash #script para imprimir breves informações do sistema root_id = "0" date = "date" no_users = "Who | wc -l" uptime = "uptime" check_root () if ["$ uid" -ne "$ root_id "]; então eco "você não tem permissão para executar este programa!"Exit 1; fi print_sys_info () echo" Horário do sistema: $ date "echo" Número de usuários: $ NO_USERS "ECHO" System UpTime: $ Uptime check_root print_sys_info Exit 0 

Salve o arquivo novamente e invocar -o como root e fazer uma verificação de sintaxe:

$ sudo bash -n sys_info.sh 
Execute a sintaxe Check in Shell Scripts

O resultado de nossa operação de verificação de sintaxe acima ainda mostra que há mais um bug em nosso script em linha 21. Então, ainda temos alguma correção de sintaxe para fazer.

Se examinarmos o script analiticamente mais uma vez, o erro em linha 21 é devido a uma cotação dupla de fechamento ausente (”) no último comando de eco dentro do print_sys_info função.

Vamos adicionar a dupla citação de fechamento no eco comando e salve o arquivo. O script alterado está abaixo:

#!/bin/bash #script para imprimir breves informações do sistema root_id = "0" date = "date" no_users = "Who | wc -l" uptime = "uptime" check_root () if ["$ uid" -ne "$ root_id "]; então eco "você não tem permissão para executar este programa!"Exit 1; fi print_sys_info () echo" Horário do sistema: $ date "echo" Número de usuários: $ NO_USERS "ECHO" SYSTEM 

Agora verifique sintaticamente o script mais uma vez.

$ sudo bash -n sys_info.sh 

O comando acima não produzirá nenhuma saída porque nosso script agora está sintaticamente correto. Também podemos rastrear a execução do script por uma segunda vez e deve funcionar bem:

$ sudo bash -x sys_info.sh 
Execução do script de shell rastreia

Agora execute o script.

$ sudo ./sys_info.sh 
Script de shell para mostrar a data, hora e tempo de atividade

Importância do rastreamento de execução do script de shell

O rastreamento do script de shell nos ajuda a identificar erros de sintaxe e, mais importante, erros lógicos. Tomar, por exemplo, o check_root função no sys_info.sh shell script, destinado a determinar se um usuário é root ou não, já que o script só pode ser executado pelo superusuário.

check_root () if ["$ uid" -ne "$ root_id"]; então eco "você não tem permissão para executar este programa!"Sair 1; fi 

A mágica aqui é controlada pelo If Declaração expressão ["$ Uid" -ne "$ root_id"], Uma vez que não usamos o operador numérico adequado (-ne Nesse caso, o que significa não igual), acabamos com um possível erro lógico.

Assumindo que usamos -Eq (significa igual a), isso permitiria qualquer usuário do sistema, bem como o usuário root para executar o script, daí um erro lógico.

check_root () if ["$ uid" -eq "$ root_id"]; então eco "você não tem permissão para executar este programa!"Sair 1; fi 

Observação: Como analisamos antes no início desta série, o comando definido Shell embutido pode ativar a depuração em uma seção específica de um script de shell.

Portanto, a linha abaixo nos ajudará a encontrar esse erro lógico na função, rastreando sua execução:

O script com um erro lógico:

#!/bin/bash #script para imprimir breves informações do sistema root_id = "0" date = "date" no_users = "Who | wc -l" uptime = "uptime" check_root () if ["$ uid" -eq "$ root_id "]; então eco "você não tem permissão para executar este programa!"Sair 1; fi print_sys_info () echo" Horário do sistema: $ date "echo" Número de usuários: $ NO_USERS "ECHO" System UpTime: $ UpTime " #Turning On and Off Debugging of Check_root Função Set -x; Check_root ; set +x; print_sys_info saída 0 

Salve o arquivo e invocar o script, podemos ver que um usuário regular do sistema pode executar o script sem sudo Como na saída abaixo. Isso ocorre porque o valor de ID DO USUÁRIO é 100 que não é igual à raiz Root_id qual é 0.

$ ./sys_info.sh 
Execute script de shell sem sudo

Bem, é isso por enquanto, chegamos ao final da série de depuração de scripts do Shell, o formulário de resposta abaixo pode ser usado para abordar quaisquer perguntas ou feedback para nós, sobre este guia ou toda a série de 3 partes.