Um exemplo prático de coprocesso

sqlite_bash_cursor-1_abertura

Algo totalmente fora do planejado e feito mais como prova de conceito: uma “biblioteca” que permite a scripts escritos em Bash acessarem bases de dados do SQLite utilizando uma conexão persistente implementada através de um coprocesso. É uma abordagem bem diferente da execução do SQLite (via pipe) a cada consulta efetuada e mais próxima do conceito do database cursor utilizado em diversas linguagens de programação.

No ficou acabou ficando tão interessante que resolvi disponibilizá-lo como um projeto no GitHub com direito a uma documentação (bem) básica e até um programa de exemplo! 🙂

Anúncios

O comando ‘select’

select-1_abertura

O select é um comando interno do Bash e sua função é construir dinamicamente um menu a partir de uma lista de opções. Isto é, ele atribui um valor numérico para cada item, lista na tela, exibe um prompt e fica aguardando a seleção do usuário antes de seguir adiante.

E se você já utilizou o comando tzselect alguma vez na vida, saiba que já esbarrou com ele pela frente… 🙂

Continuar lendo

Coprocessos em Bash – parte 2

coproc-2_abertura

Na primeira parte o coprocesso foi tanto definido com também utilizado para a leitura de forma assíncrona da saída do comando tail mas até o momento foi apenas o monólogo com um programa enviando regularmente linhas de texto a serem impressas na tela. Nesta parte algo mais bidirecional com troca de dados com o coprocesso, uso de uma variável diferente de COPROC e, claro, mais algumas explicações. 🙂

Continuar lendo

Coprocessos em Bash – parte 1

coproc-1_abertura

Quando você executa um programa, pela linha de comando ou a partir de um script, o Bash se encarrega de executá-lo, aguardar a execução terminar, verificar se ela foi bem sucedida¹ e, sendo o caso, direcionar o resultado para a tela, arquivo etc…

No coprocesso² acontece algo diferente; já que o Bash o deixará executando em segundo plano e ao mesmo tempo redirecionará as entrada e saída padrão dele para descritores de arquivo que funcionarão como um canal de comunicação entre eles. É um recurso poderoso e ao mesmo tempo simples de implementar.

E nesta primeira parte, além de uma rápida introdução, a leitura da saída de um programa através de um coprocesso.

(¹) Ou em caso de erro notificar o corrido ou então desviar a execução para algum tratamento de exceções.

(²) Não inventei este nome! Eles são chamados assim mesmo pela documentação do Bash.

Continuar lendo

Substituição de processos no Bash

proc_subst-1_abertura

Um recurso muito útil do Bash, e também de outras shells em sistemas UNIX, é o pipe¹ e com ele é possível direcionar a saída de um programa para a entrada de outro. A substituição de processos — ou process substitution — funciona de modo parecido porém aqui é possível se direcionar a saída de mais de um programa para a entrada de outro como se este fossem arquivos.

(¹) Sim, outros sistemas não UNIX também possuem este recurso mas implementado de modo bem diferente as vezes.

Continuar lendo

Controle de jobs nos scripts em Bash

controle_jobs-2_abertura

No final do controle de jobs do Bash citei de dois comandos que fazem parte do controle de jobs do Bash mas que agem dentro dos scripts, não dei maiores detalhes mas prometi falar deles em outra oportunidade. São o suspend (que pausa a execução da shell) e o wait (que faz a shell aguardar o término de sub processos antes de prosseguir com a execução).

E, sim, esta é a “outra oportunidade”! 🙂

Continuar lendo