sábado, 5 de março de 2011

Hora do Código

Com o tio Anônimo!

Para a programação de hoje, teremos um pequeno pedaço de código que eu criei para colocar um papel de parede aleatório em meu desktop Linux.
Primeiro, vejamos o código entre :


#!/bin/bash

WALLPAPERS="$HOME/Images/wallpapers"
NUMBER=`ls -C1 $WALLPAPERS | wc -l`

ID=`expr $RANDOM % $NUMBER`

ls -C1 $WALLPAPERS | head -n$ID | tail -n1 | sed "s:.*:-full \"$WALLPAPERS/&\":" | xargs hsetroot



Agora vamos analisar fazer como um açougueiro e ir por partes:

#!/bin/bash
Esta primeira linha serve para indicar qual o interpretador que será usado. Um interpretador é um programa que lerá o resto do código e executará as instruções nele contidas. No meu caso, usarei o velho e confiável bash pois estou acostumado.
A seguir temos três definições de variáveis.

WALLPAPERS="$HOME/Images/wallpapers"
Esta primeira variável guarda o endereço para meu diretório de wallpapers. Nada de excepcional aqui.

NUMBER=`ls -C1 $WALLPAPERS | wc -l`
Esta já é mais interessante, ela guarda quantos arquivos tenho nesse diretório. Na verdade, ele roda em dois comandos, o primeiro para listar todos os arquivos que há no diretório, um por linha, o segundo para contar as linhas, ou seja, os arquivos. Note o uso da variável $WALLPAPER para indicar o diretório. Os comandos são separados pelo caracter pipe '|', que transfere a saída de um para a entrada do outro.
Os programas usados foram ls para listar os arquivos e wc (wordcount) para contar linhas.

ID=`expr $RANDOM % $NUMBER`
Esta variável agora é um sorteio para escolher o número. Ela usa a variável de sistema $RANDOM para pegar um número aleatório e a divide por $NUMBER, pegando o resto - é a função do operador '%'. "expr" é um programa que recebe como argumento uma expressão matemática e avalia, neste caso ficamos com resto de NúmeroAleatório por NúmeroDeArquivos.
Esta expressão e a anterior estavam entre crases '`' para indicar que devem ser interpretadas e não avaliadas literalmente. Alguém está realmente prestando atenção nisso?

ls -C1 $WALLPAPERS | head -n$ID | tail -n1 | sed "s:.*:-full \"$WALLPAPERS/&\":" | xargs hsetroot
Agora a mágica acontece. Como podem ver pelos pipes há vários comandos sendo utilizados em seqüência. Vamos olhar:
  1. Primeiro listamos os arquivos, como já foi visto.
  2. Em seguida o comando "head" faz uma lista com os primeiro $ID arquivos. Lembremos que $ID é um valor aleatório.
  3. Logo "tail" pega o último da lista anterior. Temos agora o um arquivo que será nosso novo papel de parede.
  4. Agora "sed" faz substituições, preparando o arquivo para ser usado como papel de parede.
  5. Finalmente, "xarg" passa o papel de parede e opções de uso processadas por "sed" para "hsetroot", que irá mudar o papel de parede.
Pode parecer trabalhoso, mas é relativamente simples, sei que existem métodos mais práticos ou eficientes de otimizar esse código, mas eu queria brincar um pouco. Para mais informações sobre os comandos utilizados, leia o manual deles.

Nota: utilizável para gerenciadores de janela simples. Gerenciadores mais complexos como Gnome ou KDE não vão gostar de você mexendo na janela raiz.

Um comentário:

MagicJetPack disse...

Eu prestei atenção!