Posts Tagged ‘shell script’

PostHeaderIcon Shell script: como fazer um loop até que uma tecla seja pressionada?

Recentemente, um amigo me mandou um email com uma dúvida: ele precisava desenvolver um shell script que ficasse executando uma determinada tarefa até que uma tecla pré-estabelecida fosse pressionada. Por imaginar que essa pode ser a necessidade de muitos outros sysadmins, usuários e desenvolvedores que trabalham com o mundo GNU/Linux, resolvi compartilhar essa rápida discussão por aqui.

Bem, existem várias maneiras para resolver esse problema e resolvi indicar uma das formas que julgo ser de fácil e rápido entendimento. O ponto chave é utilizar o comando read. Vejamos o exemplo a seguir:

#!/bin/bash
while read MyKey; do
        if [ "$MyKey" == "p" ]; then
                echo "Tecla escolhida foi pressionada. Saindo do loop."
                break
        fi

        # // Inclua aqui comandos a serem executados...
        # // ...enquanto a tecla nao e pressionada
        echo "Minhas tarefas estao sendo executadas"

done
echo "Fim."

Bem, isso não parece resolver o problema, certo? Isso porque as tarefas devem ficar sendo executadas enquanto uma tecla pré-determinada (nesse caso, “p”), não for pressionada. Por outro lado, no exemplo anterior, as tarefas serão executadas apenas quando uma tecla qualquer, que não seja o próprio “p”, for pressionada. Isso ocorre porque o comando “read” ficará aguardando indefinidamente que o usuário digite alguma tecla que, por sua vez, é inserida na variável MyKey . Bem, definitivamente, não é disso que precisamos, certo?

Poucas pessoas sabem, mas o comando read não precisa ficar aguardando infinitamente alguma entrada do usuário. Com o parâmetro “-t <seg>” você pode indicar quantos segundos o comando irá ficar aguardando para que algo seja digitado. Caso o tempo indicado, em segundos, expire e nada seja digitado, o comando encerra sua execução. Sabendo disso, algumas pequenas mudanças nos farão chegar onde precisamos:

#!/bin/bash
while true ; do          
        read -n 1 -t 1 MyKey
        if [ "$MyKey" == "p" ]; then
                echo "Tecla escolhida foi pressionada. Saindo do loop."
                break
        fi

        # // Inclua aqui comandos a serem executados
        # // ...enquanto a tecla nao e pressionada
        echo "Minhas tarefas estao sendo executadas"
done
echo "Fim."

Feito, não? Entretanto, para ser um pouco mais caprichoso com o exemplo, ainda é possível alterar um “pouquinho  mais” o exemplo:

#!/bin/bash
INTERVALO=2 
while true ; do          
        read -s -n 1 -t $INTERVALO MyKey
        if [ "$MyKey" == "p" ]; then
                echo "Tecla escolhida foi pressionada. Saindo do loop."
                break
        fi

        # // Inclua aqui comandos a serem executados...
        # // ...enquanto a tecla nao e pressionada
        echo "Minhas tarefas estao sendo executadas"
done
echo "Fim."

Duas pequenas mudanças, certo? A primeira, muito básica, consiste em colocar o intervalo de tempo do read em uma variável. Dependendo do script, isso pode ajudar para mudar o comportamento sem entrar muito no código. A segunda, igualmente simples, consiste na adição do parâmetro “-s” que faz com que a tecla pressionada pelo usuário não seja impressa no terminal. Puro capricho… :-)

Acho que é isso. Até a próxima!

PostHeaderIcon Quando a ajuda cai do “shell”…

Muitos administradores de sistemas, desenvolvedores e até usuários (mais avançadas) de GNU/Linux (e outros tipos de Unix, na verdade) costumam lidar com a famosa “tela preta” por horas todos os dias. E, como não poderia ser diferente, mudar de diretórios é uma tarefa executada dezenas ou centenas de vezes em uma simples jornada de trabalho. Com isso, errar o caminho do diretório é algo bem comum e que, além de fazer você perder tempo, pode prejudicar sua paciência!

Uma das formas de facilitar sua vida no poderoso mundo da “tela preta” é o próprio recurso do auto completion, presente em shells com o bash. Outro truque bem simples e interessante, mas deconhecido por muitos, é comando shopt. Com ele, pode-se pedir uma ajuda da shell para completar seus comandos “cd” para mudar de diretório quando há apenas um pequeno erro de digitação.

Por exemplo, suponha que ao tentar entrar no diretório /tmp, vc execute o seguinte comando:

$ cd /tmx

Obviamente que você receberá uma mensagem de que esse diretório (/tmx) não existe. Entretanto, tente executar o comando shopt dessa maneira:

$ shopt -s cdspell

Em seguinda, tente executar o comando “cd /tmx” e confira que, mesmo tendo errado o caminho, você estará dentro do diretório pretendido, ou seja, o /tmp. Se você quiser que todas os seus terminais de comandos sejam executados já com essa opção, basta inserir o comando “shopt -s cdspell” no arquivo .bashrc ou .bash_profile (conforme sua distribuição Linux ou versão de Unix).

Antes de terminar, logicamente que o título desse pequeno post é completamente baseado nas “peripécias criativas” de meu grande amigo e mestre do shell Júlio Neves. Por fim, como se pode ver, mesmo no mundo da “tela preta”, às vezes, a ajuda cai do “shell”. Até a próxima!

PostHeaderIcon Shell script por Júlio Neves e Aurélio Marinho.

Certa vez, ouvi um amigo me classificar como "livrólota". É bem verdade que não posso negar o apego e a curiosidade que tenho por livros, fundamentalmente, por aqueles que, de alguma maneira, têm relação com minha área de trabalho. E, como qualquer administrador de sistemas Unix/Linux, shell script é sempre um assunto que merece atenção especial.

Quando bem dominado, o desenvolvimento de shell scripts é um aliado poderoso do dia-a-dia para automatizar tarefas e fazer com que o sistema torne-se customizável o suficiente para atender apropriadamente às suas necessidades. E, particularmente, considero esse ser um grande diferencial de sistemas baseados em Unix, como o Linux, por exemplo, quando comparado a outros sistemas que não possuem recursos semelhantes. Aliás, shell scripts são essenciais para o funcionamento de qualquer sistema da família Unix e, entendê-los com propriedade é fundamental para desmistificar e desvendar o compartamento de um sistema sob sua administração. Parte significativa do processo de boot é realizada por meio dos shell scripts, por exemplo.

Com isso, atualizei a sessão de Resenhas do site com dois livros nacionais que, de fato, fazem a diferença no aprendizado de shell script e, por conta disso, tenho recomendado ambos a colegas de trabalho e alunos. Trata-se do livro "Programação Shell Linux" de Júlio Neves e "Shell Script Profissional" de Aurélio Marinho.

PostHeaderIcon Como gerar números (pseudo)aletórios em um shell script?

Apesar de, na maioria dos casos, os shell scripts serem utilizados para manipular arquivos, agrupar logicamente utilitários comuns do sistema operacional e editar textos (de configuração de aplicativos, por exemplo), é inerente à vida de um administrador de sistemas passar por novos desafios e surpresas.

Dia desses, estava precisando implementar uma nova funcionalidade em um shell script e, seguindo a lógica que havia estabelecido, seria necessária a geração de alguns números aleatórios (ou pseudo-aleatórios, na verdade, já que falar de aleatoriedade em computação não é um assunto tão trivial). Após alguma investigação e depois de conhecer soluções mais "ortodoxas", que comento a seguir, encontrei uma maneira rápida e simples. O mais interessante é que essa alternativa não está amplamente comentada em livros e referências sobre o assunto. Daí o motivo de estar compartilhando essa dica por aqui.

Trata-se de uma variável especial, $RANDOM, existente na bash, que, uma vez acessada, gera como saída um número aleatório. Veja só isso:

  $ echo $RANDOM
  28214

Read the rest of this entry »