Linguagem de Scripts para Linux


Introdução ao BASH

Para interagir com o seu sistema operacional (no nosso caso o Linux) você pode usar interfaces gráficas ou GUI (graphic user interfaceem>, as famosas janelas) ou rodar um programa que permite que os comandos sejam inseridos um a um através de linhas de comando (command line interfaces, CLIs). Existem vários destes programas (ou Shells) mas trataremos aqui de bash (Bourne Again SHell, uma versão muito usada e já instalada na maioria das distribuições linux.

Muitas vezes, quando você usa um computador, uma tarefa pode ser realizada mais facilmente através de um comando de linha, escrito em um terminal. Por exemplo, suponha que queremos obter em um texto toda a lista de músicas que se encontram no diretório (ou pasta). Uma forma de fazer isto seria a seguinte:

Abra o terminal e digite

$ cd ~/Musica
$ ls > minhas_musicas.txt

(1) Listas de comandos podem ser encontradas em Site: SS64 ou Linux commands.

Faça suas experiências com os comandos de linha com cuidado. Nunca execute um comando cuja ação você desconhece. Embora seja difícil que um uusário sem permissão de surperusuário ou admnistrador faça grandes estragos no sistema, você pode apagar dados ou corromper programas instalados dentro de sua conta. Não se esqueça: faça sempre cópias de segurança!

Nestes exemplos $ é o prompt de comandos, a indicação de que o computador está pronto para receber instruções. O comando cd troca o foco da execução para o diretório ~/Musica, onde ~ é um atalho para representar a pasta do usuário, (home/usr). A segunda linha faz uma listagem de todos os arquivos usando ls (list screen) e, ao invés de exibí-los na tela, (devido ao sinal > ou pipe, redirecionador) envia esta lista para um arquivo de nome minhas_musicas.txt. Poderíamos ainda filtrar a lista usando ls *.mp3, e apenas os arquivos com extensão mp3 seriam listados1.

Observe agora que a Shell permite comandos encadeados ou seja, a entrada de vários comandos de uma só vez. É possível inclusive passar resultados de um comando para outro em um único passo. Para fazer isto escrevemos os comandos na mesma linha e os separamos por um ponto e vírgula (;):

$ cd ~/Musica; ls > minhas_musicas.txt

Essa linha efetuará o mesmo que as duas linhas do exemplo anterior. Para ver o conteúdo no novo arquivo criado digite gedit minhas_musicas.txt ou clique no arquivo de dentro de um gerenciador de arquivos como o Nautilus ou Thunar. Também é possível listar o arquivo de caracteres usando o comando cat minhas_musicas.txt.

Com esta técnica você pode escrever linhas com até 255 caracteres. Se uma sequência de ações for usada com frequência pode ser útil gravá-la em um arquivo, que depois pode ser executado quando necessário. Para isto use um editor qualquer que possa gravar arquivos como uma sequência simples de caracteres ASCII (isto quer dizer: sem comandos de formatação). O Ubuntu (e várias outras distribuições) traz o gedit ou kate (na distribuição KDE). Você também pode usar o geany, bluefish ou outro qualquer de sua escolha.

Uma lista de comandos gravada em um arquivo executável é chamada de script. Para especificar que se trata de um shell script colocamos na primeira linha a seguinte informação:

#!/bin/bash

O sinal de sustenido (#) em uma linha qualquer (exceto na primeira linha) é usado para indicar um comentário, um trecho que não é executado pela shell. Na primeira linha ele possui um significado especial: #! indica que o arquivo a seguir deverá ser executado pela bash shell fornecendo o caminho onde bash está instalado (normalmente em /bin/bash). Outros comandos, a serem executados na ordem em que se encontram, podem ser inseridos em linhas sucessivas. Você ainda pode usar o ponto e vírgula para separar comandos na mesma linha mas, em um script isto não é necessário nem recomendado. É mais fácil ler e compreender scripts onde cada linha contém um único comando.

O seguinte exemplo ilustra o conceito:

#!/bin/bash
# Esta linha é um comentário e não é executada
# Primeiro faça uma lista de músicas (mp3 e wav)
cd ~/Musica
ls *.mp3 > MusicasMp3
ls *.wav > ArquivosWav
# Faça uma lista de livros no formato pdf, na pasta ~/Livros
cd ~/Livros
ls *.pdf > LivrosEmPdf

Evidentemente estas linhas supõem a existências das pastas ~/Musicas e ~/Livros caso contrário uma mensagem de erro será exibida. Comentários são úteis para tornar mais legíveis os scripts, principalmente para o caso de outro usuário (ou você mesmo, no futuro) utilizar o script. Grave seu script com o nome lista_arquivos em uma pasta /.scripts (ou outro nome de sua preferência). Para executar esse script podemos digitar:

# se você já está na pasta scripts:
$ ./lista_arquivos
# se você não está na pasta scripts:
$ ~/.scripts/lista_arquivos

Alternativamente, para que um script seja encontrado a partir de qualquer outro diretório é necessário informar à shell como encontrá-lo. A shell usa uma “variável de ambiente” ( environment variable) chamada PATH para localizar onde estão os arquivos a serem executados. Para compreender isto melhor abra um terminal e digite:

$ echo $PATH
/usr/local/bin:/usr/bin:/bin

A segunda linha é a resposta (ou output) do comando echo, destinado a exibir informações, indicando que neste computador a shell fará uma busca nos diretórios /usr/local/bin, /usr/bin e /bin quando um comando for emitido. Observe que nossa pasta de scripts não está incluída. Para que o arquivo lista_arquivos seja executado podemos acrescentar a pasta onde ele reside ao PATH:

PATH=$PATH:/.scripts
$ echo $PATH
/usr/local/bin:/usr/bin:/bin: /.scripts

(2) Lembrando:

. Atalho para o diretório atual
cd ~ Para diretório home.
cd .. Volta para o dir pai

Observe que PATH contém agora a pasta /.scriptscode>. Esta alteração, no entanto, permanece válida apenas durante a sessão do terminal, ou dentro do arquivo de script de onde ela foi emitida. Veremos depois como alterar de forma permanente esta variável.

O ponto2, na primeira linha não comentada, é uma referência ao diretório atual, neste caso /.scripts. O til na outra linha, como já vimos, é um atalho para a pasta do usuário, o mesmo que /home/nome_do_usuário.

O último passo consiste em tornar este arquivo um executável. Para isto use o comando chmod (change mode):

$ chmod u+x teste1
# agora você pode executar o arquivo teste1
$ ./teste1

Se você procurar nas pastas ~/Musicas e ~/Livros deverá encontrar os arquivos recentemente gravados com o conteúdo esperado! O sistema de permissões do Linux (diretamente copiado do Unix) constitui uma das grandes vantagens deste sistema operacional. Por causa dele um usuário só pode alterar arquivos de sua propriedade enquanto arquivos de sistema só podem ser alterados pelo superuser ou gerente do sistema. Mesmo em seu próprio computador você não faz (ou pelo menos, não deve fazer) login como superuser.

Para alterar o PATH de modo definitivo você pode usar os seguintes procedimentos: primeiro verifique seu caminho atual usando o comando: $ echo $PATH. Para alterar a variável PATH para todos os usuários do sistema edite o arquivo /etc/profile (como root) e modifique a linha que começa com "PATH =".

sudo gedit /etc/profile
# forneça seu password
# procure a definição de PATH e edite para: PATH = "$PATH: $HOME/.scripts

(3) O ponto (.) como primeiro caracter do nome do arquivo .bash_profile ou indica que este é um arquivo oculto, um arquivo que não aparece normalmente em listagens requisitadas com o comando ls nem dentro do gerenciador de arquivos. Para listar arquivos ocultos use ls -a ou pressione Ctrl-H de dentro do Nautilus ou do Thunar (ou outro gerenciador de arquivos). Diretórios também podem ser ocultos da mesma forma.

(4) Segundo o manual online de bash (man pages) o arquivo .bash_profile é executado quando o usuário faz login em uma shell. Se você já está logado e abre uma janela de terminal (por exemplo) o arquivo .bashrc é executado.

Para alterar o PATH de um único usuário edite o arquivo /home/nome_do_usuario/.bash_profile ou .bashrc(Veja nota4). A especificação para o caminho no /etc/.bash_profile, ou /etc/.bashrc, é análoga ao caso anterior. Agora você não precisa usar sudo pois o arquivo é de sua propriedade e você tem permissão para alterá-lo.

gedit /etc/.bash_profile
# forneça seu password
# procure a definição de PATH e edite para: PATH = "$PATH: $HOME/scripts
export PATH

A linha de comando PATH = "$PATH: $HOME/scripts pega o conteúdo da variável de ambiente PATH já definida para todos os usuários no arquivo /etc/profile, e acrescenta a ela o nome do diretório $HOME/scripts (ou qualquer outro que você queira incluir). O comando export na última linha serve para que a variável fique visível fora do script onde ela foi definida.

Recapitulando: Para escrever um arquivo executável você dever informar em seu cabeçalho quem o executará (#!/bin/bash no caso de bash, #!/bin/env python no caso de um script Python, etc.Depois você deverá informar o caminho completo para a sua execução ou colocar o diretório onde seu script está na variável path. Finalmente você deve torná-lo um executável com chmod.

Para saber um pouco mais sobre as permissões5 de um arquivo vamos executar o comando ls -l, onde -l é uma chave (opção) para exibir permissões:

$ ls -l teste1
 -rwxr-xr-- 1
 usuario_1 grupo_1 227 Jun 8 21:22
teste1

(5) Permissões:

r permissão para leitura(read)
w permissão para escrever (write)
x permissão para executar (execute)
- substitui r, w, x se a permissão é negada

As permissões são listadas por meio de 9 caracteres: o primeiro indica o tipo do arquivo (d, se é um diretório, l para links e para arquivos comuns. Em seguido temos 3 grupos formados por 3 letras r, w, x (veja tabela) que se referem ao dono do arquivo (o usuário que o criou), ao grupo a que este usuário pertence, e aos demais usuários do computador ou rede. No exemplo acima teste1 é um arquivo () pertencente à usuario_1, grupo_1. O dono pode ler, escrever (gravar) e executar (rwx), usuários do grupo podem ler e executar (r-x) mas não modificar este arquivo, e os demais usuários podem apenas ler (r–).

Exibindo valores e resultados

Para exibir o valor da variável PATH, uma variável do sistema estabelecida durante o boot, usamos o comando echo $PATH. Também podemos usar echo para exibir mensagens de textos:

$ echo Uma mensagem para seu usuario ...
 Uma mensagem para seu usuario ...
$ echo # pula uma linha
$ echo "Um texto pode ser delimitado por aspas duplas ou simples"
Um texto pode ser delimitado por aspas duplas ou simples
$ echo ou ate mesmo aparecer sem nenhuma aspas ou ate mesmo aparecer sem nenhuma aspas

Observe que não é obrigatório o uso de aspas embora, para alguns usuários, pode ser mais claro ler programas onde as strings estejam delimitadas. Mensagens são úteis em um script, por exemplo, para passar informações sobre o funcionamento ou requisitar a digitação de algum dado.

echo "Os seguintes usuarios estao logados no sistema:"
who

O comando who exibe todos os usuários logados no momento. Para exibir uma informação sem trocar de linha usamos o parâmetro -n.

echo -n "Hoje e: " 	date
# O script acima exibe algo como: 	Hoje e: Wed Jun 22 11:29:23 BRT 2011