Bash novo. Apesar da competição recente. os vetores associativos



Documentos relacionados
Formação de Administradores de Redes Linux LPI level 1. Aula 2 SENAC TI Fernando Costa


Manual do Teclado de Satisfação Online WebOpinião

LÓGICA DE PROGRAMAÇÃO. Professor Celso Masotti

Permitir a troca de mensagens de texto entre os dois alunos; Permitir que um aluno enviasse para o outro uma cópia de prova;

Conceitos básicos da linguagem C

Capítulo 2. Processos de Software Pearson Prentice Hall. Todos os direitos reservados. slide 1

Introdução ao Shell Script

4.1. UML Diagramas de casos de uso

TÉCNICAS DE PROGRAMAÇÃO

9 Comandos condicionais

Sumário. Administração de Banco de dados Módulo 12. Ilustração Backup-Recovery. Recuperação (Recovery) - Definição

agility made possible

Entendendo as Permissões de Arquivos no GNU/Linux

Tópicos da Aula. Que é são requisitos? Tipos de Requisitos. Requisitos Funcionais. Classificação de Requisitos. Requisitos de Software.

UML & Padrões Aula 3. UML e Padrões - Profª Kelly Christine C. Silva

Configurando a emissão de boletos no sistema

Engenharia de Software e Gerência de Projetos Prof. Esp. André Luís Belini Bacharel em Sistemas de Informações MBA em Gestão Estratégica de Negócios

Organização de Computadores Software

Sistemas Operacionais. Prof. André Y. Kusumoto

Implementando uma Classe e Criando Objetos a partir dela

ADMINISTRAÇÃO DE BANCOS DE DADOS MÓDULO 13

Resolução da lista de exercícios de casos de uso

Conectar diferentes pesquisas na internet por um menu

Trabalho 3: Agenda de Tarefas

Especificação do Trabalho Prático

2 echo "PHP e outros.";

Descrição do Produto. Altus S. A. 1

3.1 Definições Uma classe é a descrição de um tipo de objeto.

O processador é um dos elementos componentes do computador moderno, sendo responsável pelo gerenciamento de todo o computador.

Guia de utilização da notação BPMN

Montagem e Manutenção. Luís Guilherme A. Pontes

Aula de JavaScript 05/03/10

Aula 2 Revisão 1. Ciclo de Vida. Processo de Desenvolvimento de SW. Processo de Desenvolvimento de SW. Processo de Desenvolvimento de SW

ITIL v3 - Operação de Serviço - Parte 1

1) Ao ser executado o código abaixo, em PHP, qual será o resultado impresso em tela?

3 Qualidade de Software

BCC402 Algoritmos e Programação Avançada Prof. Marco Antonio M. Carvalho Prof. Túlio Ângelo M. Tóffolo 2011/1

TUTORIAL PARA UTILIZAÇÃO DA PLATAFORMA LMS

BACHARELADO EM SISTEMAS DE INFORMAÇÃO EaD UAB/UFSCar Sistemas de Informação - prof. Dr. Hélio Crestana Guardia

IMPLEMENTAÇÃO DE UM PROTÓTIPO PARA INFORMATIZAÇÃO DE PROCESSO DE ADEQUAÇÃO DE FÉRIAS

Introdução a. Shell Script. Clésio Matos

Campus Capivari Análise e Desenvolvimento de Sistemas (ADS) Prof. André Luís Belini prof.andre.luis.belini@gmail.com /

COMO PROGRAMAR SEU TIME

Professor: Macêdo Firmino Disciplina: Sistemas Operacionais de Rede

INTRODUÇÃO À LINGUAGEM C++

COMO COMEÇAR 2016 se organizando?

Especificação do Trabalho Prático

Introdução a Banco de Dados Aula 03. Prof. Silvestri

Este documento pode ser baixado em:

5 EDI - As montadores e suas distribuidoras

Computador E/S, Memória, Barramento do sistema e CPU Onde a CPU Registradores, ULA, Interconexão interna da CPU e Unidade de controle.

APÓS A INSTALAÇÃO, MÃOS À OBRA. E AO TECLADO. MANUAL DE INSTALAÇÃO

Capítulo 2. VARIÁVEIS DO TIPO INTEIRO

Manual do Usuário - ProJuris Web - Biblioteca Jurídica Página 1 de 20

Computação II Orientação a Objetos

Objetivo: descrever como abrir uma solicitação de suporte técnico através da internet.

GladiusSimpleReport. Este manual, visa mostrar, como utilizar o GladiusSimpleReport atravéz de exemplos.

IMPRESSÃO DE DADOS VARIÁVEIS usando Adobe InDesign e OpenOffice.org

BSI Letramento Digital Prof. André Di Thommazo. Organização pessoal

Simulado Informática Concurso Correios - IDEAL INFO

Criar as tabelas para um banco de dados

1. Introdução. Avaliação de Usabilidade Página 1

O Manual do ssc. Peter H. Grasch

Bem-vindo ao curso delta Gerenciamento de peso para a versão 9.1. Este curso aborda a nova solução de peso introduzida nessa versão.

Usando o do-file editor Automatizando o Stata

LEAN SIX SIGMA PARA O SERVICE DESK

CADERNOS DE INFORMÁTICA Nº 1. Fundamentos de Informática I - Word Sumário

SquidCacheAux para BrazilFW

natureza do projeto e da aplicação métodos e ferramentas a serem usados controles e produtos que precisam ser entregues

Python Intermediário. terça-feira, 4 de agosto de 15

Engenharia Elétrica Eletrônica Slides 20: TCP/IP em Winsocks 2. API do Windows para programar utilizando o protocolo TCP/IP Prof. Jean Marcelo SIMÃO

Figure 2 - Nós folhas de uma árvore binária representando caracteres ASCII

Lógica para a Programação - 1º semestre AULA 01 Prof. André Moraes

OBI2010 Caderno de Tarefas

Gestão da TI. Os custos escondidos da. Conheça os custos escondidos na gestão amadora da TI e pare de perder dinheiro.

RELATÓRIO DE PROGRAMAÇÃO II. Igor Bissoli. Ramon Bambini. Victor Melo

Manual de Uso do Módulo. MerchFinanças

MIT072 Manual de Operação do Portal - Professores

- Aulas 57, 58, 59 e 60 - Técnicas de programação. Funções

Arquitetura dos Sistemas Operacionais

Algumas dúvidas freqüentes com relação à suíte OpenOffice.

OBI2012 Caderno de Tarefas

Manual das planilhas de Obras v2.5

CONCEITOS BÁSICOS DE UM SISTEMA OPERATIVO

Boletim Eletrônico de Recolhimento Manual do Sistema. Boletim Eletrônico de Recolhimento. Manual do Sistema

Manual do Usuário CMS WordPress Versão atual: 3.0

Scripts Shell. João Medeiros 1 / 20

PROGRAMAÇÃO ORIENTADA A OBJETO EM PHP

White-box test: Também conhecido como teste estrutural, tem por objetivo validar os dados derivados das funções do sistema.

Escrito por Júlio Oliveira Ter, 30 de Junho de :06 - Última atualização Seg, 17 de Agosto de :25

ALGORITMOS E FLUXOGRAMAS

Curso de Especialização em Tecnologia da Informação. Engenharia de Software

Bem-vindo ao tópico sobre consultas no SAP Business One.

Projeto ECA na Escola - Plataforma de Educação à Distância

Transcrição:

Explore a última versão do grande Bourne-again shell ANÁLISE Bash novo Apesar da maturidade do Bash, seus desenvolvedores continuam aprimorando-o. A versão 4 do shell está cheia de novidades. por Bernhard Bablok e Nils Magnus yewkeo, 123RF Apesar da competição recente por parte de poderosas alternativas como o Zsh [1], o Bourne-again shell (Bash) [2] ainda é o rei do pedaço no console do GNU/Linux. O Bash, que pode ser usado de forma interativa, também serve como uma linguagem de script simples e prática. O Bash faz parte do esqueleto de todo sistema GNU/Linux mais um motivo para investigar os benefícios de adotar a nova versão 4, lançada em fevereiro de 2009. Por que não? Em sistemas em produção, talvez seja mais recomendável avaliar se é realmente necessário atualizar o Bash para sua nova versão. Por um lado, as principais distribuições certamente difundirão a nova versão por meio de suas atualizações, então o novo Bash fatalmente vai chegar ao seu sistema mais cedo ou mais tarde. Programadores e usuários avançados, por outro lado, gostam de usufruir os benefícios oferecidos por novas versões o mais rápido possível. Quem desejar já se familiarizar com o shell principal da maioria das distribuições do futuro certamente gostará de passar algum tempo com o Bash 4 já. A tabela 1 mostra um resumo de alguns novos recursos importantes; para uma listagem completa, verifique o arquivo NEWS na documentação do Bash. Este artigo levanta algumas das mudanças mais importantes. Linha de comando Usuários da linha de comando apreciarão algumas extensões inconspícuas, mas muito úteis, incorporadas ao novo Bash. Por exemplo, a string ** é expandida para uma lista de arquivos e caminhos sob o diretório atual, de forma semelhante ao comando externo find. Porém, os usuários precisam ativar esse recurso por meio do comando shopt -s globstar. Os desenvolvedores agora adotaram uma técnica mais amigável para um dos maiores mistérios do Bash: o redirecionamento da saída de erro padrão. Em vez do mantra 2>&1 1>arquivo, agora os usuários podem usar simplesmente &> >arquivo para redirecionar as saídas padrão e de erro para um único arquivo. O atalho &, que redireciona o erro padrão de um comando para um pipe, é outra novidade útil. Vetores associativos A crença popular reza que scripts Bash criam muitos processos, que acabam prejudicando o desempenho. Mas muitos dos aplicativos simples que costumavam ser usados com o Bash, incluindo sed, grep, basename e dirname, já não são mais necessários; o Bash realiza essas tarefas tão rápido quanto qualquer outra linguagem de script com ferramentas embutidas. Apesar desses avanços, os programadores Bash continuam com olhares invejosos a Perl e Python, ambos com estruturas de dados mais versáteis. Em sua versão 4, o Bash finalmente acrescenta a seus vetores unidimensionais os vetores associativos (semelhantes aos hashes em Perl e dicionários em Python). Para muitos programadores, essa mudança, por si só, já é motivo suficiente para adotar a nova versão, pois ela oferece uma solução bem mais elegante a vários problemas. Por exemplo, os desenvolvedores podem usar textos arbitrários como índices de vetores associativos em vez de apenas inteiros. A listagem 1 mostra um exemplo. A listagem 2 contém um script que ordena arquivos em diretórios 58 http://www.linuxmagazine.com.br

Bash 4 ANÁLISE Tabela 1: Principais mudanças Mudança Substrings PID autocd checkjobs read mapfile command_not_found_handle globstar Chaves Saída de erro padrão Descrição A extensão para parâmetros de posição suporta o desvio zero O PID do shell atual está disponível na variável BASHPID Suporta navegação rápida por meio do nome do diretório Verifica e relata trabalhos (jobs) ativos ou parados na saída Atribui entradas parciais a variáveis e mantém seus valores mesmo que o comando tenha seu tempo expirado Facilita o processamento de arquivos O Bash 4 chama essa função caso não consiga encontrar um comando Usa ** para realizar buscas recursivas ao longo de múltiplos diretórios A extensão cria uma lista de valores com zeros na frente Em vez de 2>&1 1>arquivo, o Bash agora suporta &> >arquivo Saída de erro padrão Da mesma forma, & substitui 2>&1 case Expansão variável Conversão automática Vetores associativos coproc Seleção Agora o Bash 4 suporta ;;, ;& e ;;& para terminar um case. O primeiro processa incondicionalmente as instruções do próximo grupo; o segundo verifica mais uma vez e, se adequado, continua processando o próximo grupo. Os operadores ^ e, alteram para caixa alta ou baixa declare -u e declare -l convertem automaticamente para caixa alta ou baixa ao atribuir valores Os índices podem ser strings: $idade[ fulano ] Cria processos assíncronos O comando read -t 0 -u fd verifica se o descritor de arquivo fd fornece dados Complete a sua coleção O objetivo da coleção é trazer conhecimento confiável e de alto nível sempre com enfoque prático e voltado para a utilização do sistema Linux e de outras tecnologias livres. Mais informações Site: www.linuxmagazine.com.br Linux Magazine #58 Setembro de 2009 Tel: 11 4082-1300 59

ANÁLISE Bash 4 Listagem 1: Programação com vetores associativos 03 declare -A name 04 05 nome[ Linus ]= Torvalds 06 nome[ Bill ]= Gates 07 nome[ Steve ]= Jobs 08 nome[ Richard ]= Stallman 09 10 # Mostrar todos os valores: 11 echo Valores: ${nome[@]} 12 13 # Mostrar todas as chaves: 14 echo Chave: ${!nome[@]} 15 16 # Acessar valores individuais 17 for v in {!nome[@]} ; do 18 echo $v ${name[$v]} 19 done Listagem 2: Texto errado em listas 03 dirs= 04 05 for f in $@ ; do 06 d=`getdir $f ` 07 mkdir p $d 08 mv f $f $d 09 dirs= $dirs $d 10 done 11 12 for d in $dirs; do 13 createindex $d 14 done Listagem 3: Vetores associativos 03 declare A dirs 04 05 for f in $@ ; do 06 d=`getdir $f ` 07 mkdir p $d 08 mv f $f $d 09 dirs[$d]=1 10 done 11 12 for d in ${!dirs[@]} ; do 13 createindex $d 14 done segundo suas propriedades por exemplo, a data de criação. O script possui dois problemas fundamentais: primeiro, ele não funciona com diretórios que contenham espaços em branco, e segundo, ele pode processar cada diretório mais de uma vez. As versões anteriores do Bash usavam técnicas diferentes para resolver esse problema. No Bash 3.2, os programadores podem armazenar os nomes de diretórios entre aspas num vetor. Um script poderia evitar o duplo processamento por meio de buscas no nome ou por meio de uma lenta busca linear no vetor. Nenhuma dessas técnicas é particularmente elegante. O Bash 4 lida com essa tarefa de forma bem mais simples (veja a listagem 3): o nome do diretório serve como chave; o valor não tem importância. Na linha 12, o loop itera por todas as chaves. A construção especial com alguns & entre aspas duplas faz o mesmo que em outros pontos do Bash: faz com que o shell processe os valores como elementos individuais. Portanto, a solução funciona com diretórios que contenham espaços em branco. Arquivos A listagem 4 contém um padrão de programação típico. O loop while nas linhas 5 a 8 processa as linhas de um arquivo uma após a outra e guarda o resultado num vetor. Essa construção ocorre com frequência, mas infelizmente é imperfeita. Caso a úlima linha não termine com um caractere de nova linha, o loop não armazenará a linha. O comando read embutido não fará a atribuição sem a nova linha. A nova versão do Bash não apenas economiza teclas como também oferece uma implementação mais limpa. Em vez do loop while, uma única linha já faz todo o trabalho sujo (linha 4 da listagem 5). O comando mapfile usa o apelido readarray, que descreve seu propósito de forma mais precisa. O comando mapfile pode até fazer mais que isso. Para mais detalhes, help mapfile e man mapfile devem ajudar bastante. O comando pode processar múltiplas linhas de uma única vez e processá-las uma a uma com uso de uma função callback. Infelizmente, os desenvolvedores não forneceram uma implementação especialmente elegante dessa função. O Bash 4 chama a função callback antes de processá-la, e não depois. Essa técnica oferece ao script um callback antes de o shell de fato ler algo, mas perde um callback após a última linha. Apesar dessa complicação, a função ainda é útil para processar arquivos inteiros. Caixa alta e baixa Se você já precisou implementar uma técnica robusta para processamento de arquivos de configuração ou entrada de usuários, já conhece o seguinte problema: o valor no arquivo de configuração ou o resultado da operação read pode ser SIM, sim, Sim, YES, true ou evidentemente. Até o Bash 3.2, os autores de scripts usavam o utilitário externo tr para converter o valor para caixa alta ou baixa. O Bash 4 facilita isso. A instrução declare -u Variável converte automaticamente todas as atribuições da variável Variável para caixa alta. De forma análoga, declare -l converte para caixa baixa. Essas ferramentas de conversão economizam chamadas a programas externos e melhoram o desempenho do script. Para converter apenas uma vez, em vez de globalmente, é possível usar a nova extensão de parâmetro: foo=sim echo ${foo^} echo ${foo^^} 60 http://www.linuxmagazine.com.br

Bash 4 ANÁLISE Quadro 1: Entrevista com o desenvolvedor do Bash 4 Chet Ramey Chat Ramey é gerente do Grupo de Segurança e Engenharia de Redes da divisão de serviços de TI da Case Western Reserve University. Ele é o mantenedor do Bash desde 1990. A Linux Magazine fez algumas perguntas a ele com relação à última versão do Bash. A comunidade do Software Livre não via uma nova versão do Bash há algum tempo. Alguns dizem que a versão 3.2 era adequada para praticamente todas as tarefas necessárias. Então, por que algo novo? Fico feliz que as pessoas tenham uma opinião tão boa sobre o Bash 3.2. Eu não gosto de lançar novas versões com muita frequência, pois o shell é muito básico para vários distribuidores, mas já estava na hora. O Bash 4.0 oferece diversos recursos novos (normalmente eu não incluo grandes recursos novos em versões de atualização), várias correções de falhas que não entraram como patches no 3.2, e mais funcionalidades para os recursos já presentes. Quais os três avanços ou novos recursos que você acha mais interessantes? Vejamos. Essa é difícil, porque há várias que são boas. 1. Vetores associativos; 2. A correção para o último trecho incompatível com Posix. O shell não exige mais os parênteses balanceados ao processar substituições de comandos no estilo $(...) (por exemplo, ao processar uma instrução case dentro de uma substituição de comando). Estou empolgado com isso porque foi, certamente, a parte mais complicada para implementar. Não foi fácil com um parser gerado pelo yacc. 3. As melhorias possíveis com o bind -x. Ao executar um comando associado a uma sequência chave com bind -x, esse comando terá acesso ao buffer do readline e à posição atual do cursor e poderá alterá-la. Uma função de shell poderia chamar um programa externo para rearranjar as palavras na linha de comando, por exemplo, e fazer com que se refletissem no buffer de edição. Acho que esse recurso ainda não foi muito usado, mas há várias possibilidades. O Bash 4 acrescentou vários novos recursos para facilitar a programação. Você acha que ele já consegue competir com linguagens como Perl e Python? Acho que Perl e Python são linguagens mais sofisticadas, pois têm muito mais funções embutidas. Shells em geral são feitas para grudar programas externos ou funções de shell, além de oferecerem um ambiente para facilitar essas tarefas. Porém, é possível escrever programas bastante complexos usando shell: veja o bash debugger, por exemplo. O Bash 4 também acrescentou diversos novos recursos para usuários da linha de comando. Agora ele está pronto para competir com shells especializadas nisso, como o Zsh? Acho que sim. O Bash talvez não tenha tantas funcionalidades embutidas, mas acho que oferece ferramentas suficientes para torná-lo um ambiente interativo tão bom quanto o Zsh. Há algumas discussões sobre estilos de programação e uso de recursos em shell scripts. Enquanto alguns tradicionalistas exigem compatibilidade com o Bourne shell, outros usam inúmeros recursos do Bash. Qual o seu ponto de vista? E a compatibilidade com o Bash 3.2? Você recomenda adotar o 4.0 imediatamente ou deixá-lo em paralelo com o 3.2 por certo tempo? Acho que depende dos seus objetivos. É fato que quando pedem compatibilidade total com o Bourne shell, referem-se à versão do sh presente em suas máquinas. Há diferentes versões do Bourne shell: v7, SVR2, SVR3, SVR4, SVR4.2... E fornecedores distintos acrescentam diferentes conjuntos de recursos à mesma versão do Bourne shell. É difícil descobrir exatamente o que se quer dizer com Bourne shell original. Para quem se interessar em escrever scripts portáveis, eu sugeriria seguir o padrão Posix. Ele pode ser considerado uma linha de base que todos os shells padrão implementam. Muitos senão todos fornecedores incluem um shell que obedece ao Posix. E se o seu fornecedor não incluir um, o Bash é compatível com praticamente todas as plataformas existentes. Com relação à retrocompatibilidade com o Bash 3.2, tentei mantê-la ao máximo. Em certos locais, achei que o comportamento do Bash 3.2 era errado e o corrigi, sacrificando a retrocompatibilidade. Também existe a noção do nível de compatibilidade do shell, que preserva explicitamente certos comportamentos antigos quando ativado (veja as opções compat31 e compat32 do Bash). Creio que o nível de compatibilidade com o Bash 3.2 é bem alto e não deveria afetar a portabilidade dos scripts. Acho que a compatibilidade é suficiente para os usuários atualizarem para o Bash 4.0 imediatamente e gradativamente acostumarem-se com os novos recursos. Linux Magazine #58 Setembro de 2009 61

ANÁLISE Bash 4 Listagem 4: Técnica antiga para processar arquivos 03 inputfile= $1 04 i=0 05 while read line; do 06 lines[$i]= $line 07 let i++ 08 done < $inputfile 09 10 # Processamento das linhas... Listagem 5: Nova técnica para processar arquivos 03 inputfile= $1 04 mapfile n 0 lines < $inputfile 05 06 # Processamento das linhas... O primeiro comando converte a primeira letra para caixa alta e imprime Sim. O segundo converte todas as letras, portanto retorna SIM. Se for necessário converter para caixa baixa, pode-se usar: foo=sim echo ${foo,} echo ${foo,,} A sintaxe ${Var^Padrão} suporta substituições ainda mais complexas. Co-processos e listas A maioria dos fabricantes de hardware atuais oferecem processadores com múltiplos núcleos, e já começam a aparecer técnicas para explorar essas funcionalidades. O Bash 4 permite ao programador executar o que se chama de co-processos : coproc pipes comando Este comando retorna os descritores de entrada e saída padrão do comando nas variáveis pipes[0] e pipes[1]. O processo principal do Bash os utiliza para se comunicar com o co-processo, o que é particularmente útil para shell scripts que tratam com processamento paralelo [5]. Listas de valores automáticos, ou expansões de chaves, já existem há tempos, mas eram desconhecidas pela maioria dos usuários: o comando echo {5..15} conta do primeiro até o último número. Muitos programadores Bash ainda usam o programa externo seq para isso: echo $(seq -s 5 15) O comando seq não apenas é mais lento, como seu resultado é mais Mais informações [1] Zsh: http://www.zsh.org difícil de ler. Porém, se for preciso ordenar esse tipo de saída, as versões anteriores do Bash não ajudavam, pois eram incapazes de inserir um zero à frente dos números menores que dez. O Bash 4 já faz isso: echo {05..15} A nova versão da shell padrão do GNU/Linux oferece alguns recursos úteis para os programadores e fãs da linha de comando. Apesar de algumas pequenas incompatibilidades, o mantenedor do Bash incentiva os usuários a fazer a atualização (confira a entrevista no quadro 1). A nova versão do Bash não é exatamente magra o binário agora ocupa 730 KB, em lugar dos 590 KB da versão anterior. Ele é mensuravelmente, mas não perceptivelmente, mais lento; os tempos de execução mais longos dificilmente devem ser problemáticos em hardwares atuais. Para usar as novas funções hoje, é preciso ter controle total sobre o ambiente para substituir todo o Bash. Em algums scripts, talvez seja preciso consultar as variáveis de ambiente BASH_VERSION e BASH_ VERSINFO para se assegurar da versão em execução. Caso a versão não seja a 4, simplesmente termine o script graciosamente e emita uma mensagem de erro explicando o motivo. n [2] Bash: http://tiswww.case.edu/php/chet/bash/bashtop.html [3] Bernhard Bablok, Shell paralelo : http://lnm.com.br/article/2586 Gostou do artigo? Queremos ouvir sua opinião. Fale conosco em cartas@linuxmagazine.com.br Este artigo no nosso site: http://lnm.com.br/article/2998 62 http://www.linuxmagazine.com.br

Bash 4 ANÁLISE SEÇÃO Linux Magazine #58 Setembro de 2009 63