Mostrando postagens com marcador Shell. Mostrar todas as postagens
Mostrando postagens com marcador Shell. Mostrar todas as postagens

terça-feira, 27 de janeiro de 2009

Mostrando o status e o branch de repositórios git no console

Com uma função de shell script e a ajuda da variável PS1 podemos fazer uma configuração bem interessante: exibir no próprio console em qual branch estamos e qual o estado dele.

Um exemplo de como fica:
Git no terminal

Esse é um screenshot do meu desktop, mostrando o repositório do tracks (um aplicativo interessante para quem pretende usar a metodologia GTD). Em amarelo, o caminho do repositório. Entre os colchetes, o branch no qual estamos, e finalmente, um * indicando se o repositório contém modificações ainda não confirmadas no repositório.

Para configurar, basta adicionar ao seu .bashrc:

function parse_git_dirty {
[[ $(git status 2> /dev/null | tail -n1) \
!= "nothing to commit (working directory clean)" \
]] && echo "*"
}

function parse_git_branch {
git branch --no-color 2> /dev/null | \
sed -e '/^[^*]/d' \
-e "s/* \(.*\)/[\1$(parse_git_dirty)]/"
}

export PS1='\u@\h \[\033[1;33m\]\w\[\033[0m\]$(parse_git_branch)$'


Visto originalmente aqui.

[]'s
- Walter Cruz

domingo, 11 de maio de 2008

Validação aritmética em shell scripting

Shell
Em shell-scripts, costumamos usar os recursos do Korn Shell, shell desenvolvido por David Korn nos AT&T Bell Labs na década de 1980 como uma extensão do Standard Shell.

Por exemplo, para ciclo de contagem progressiva:
for i in `seq 10`
do
echo $i
done


Outro tipo de contagem:
if [ -z "$FILENAME" ]
then
NULL_FILENAME_COUNT=`expr $NULL_FILENAME_COUNT + 1`
fi


Mas nos esquecemos que em ambiente GNU/Linux usamos o bash, que possui recursos ainda mais poderos que o Korn Shell.

Por exemplo, vamos reescrever a contagem de 1 a 10 usando a validação aritmética:
for ((i=1; i<=10; ++i))
do
echo $i
done


A outra contagem também pode ser escrita usando recursos embutidos do bash, sem precisar levantar um processo test[ e ] são um apelido para test:
if [[ -z "$FILENAME" ]]
then
((++NULL_FILENAME_COUNT))
fi


Em ambiente BSD, o shell usado é o CShell, desenvolvido por Bill Joy – sim! O cara do Java! O CShell tem uma sintaxe propositalmente similar à de C e também é bastante poderoso.

Voltemos a nossos exemplos:
@ i = 0
while ($i < 10)
@ i++
echo $i
end


O ambiente aritmético em CShell é validado por @.
if (!($?filename)) then
@ nullFilenameCount++
else
if (!($%filename)) \
@ nullFilenameCount++
endif


Em ambiente GNU/Linux, você pode evocar o CShell através de tcsh.

Mais dicas nas páginas de manual (manpages) bash e tcsh.

[]'s
Cacilhas, La Batalema

terça-feira, 1 de janeiro de 2008

Papel de parede aleatório

Este artigo é para aqueles que, como eu, usam gerenciadores de janela alternativos.

A maior parte das pessoas que entram no maravilhoso mundo livre do GNU/Linux ou fica nadando no rasinho da piscina – digo, KDE e Gnome – ou mergulha na escuridão negra da linha de comando…

Poucos são os que exploram saídas alteranativas, como ambientes desktop mais leves ou combinações de aplicações gráficas e gerenciadores de janela.

Nesses casos, há algumas aplicações que gerenciam papel de parede, como xv, xsetroot e wmsetbg.

Pessoalmente prefiro usar wmsetbg, que faz parte do pacote do Window Maker, mas pode ser usado com qualquer gerenciador de janela. Algumas vantagens são a flexibilidade para lidar com imagens e permitir recursos de transparência dos gerenciadores de menu.

Sabendo disso, uma coisa legal que podemos fazer com Shell é escolher um papel de parede aleatório a cada login.

Vamos aqui criar um script que faça isso.

O script deve começar indicando qual o interpretador a ser usado:
#!/bin/bash


Vamos agora listar as imagens que queremos em uma variável. Vamos chamá-la IMGLIST.

A ideia aqui é listar os diretórios onde estarão as imagens:
IMGLIST=$(
ls \
/home/Imagens/OndeEhOParaiso/*.jpg \
/home/Imagens/OndeEhOParaiso/*.png \
/home/Imagens/Virtual/*.jpg \
/home/Imagens/Virtual/*.png \
/home/Imagens/Wallpapers/*.jpg \
/home/Imagens/Wallpapers/*.png \
/home/Imagens/digitalblasphemy/*.jpg \
/home/Imagens/digitalblasphemy/*.png \
/home/Imagens/heise.de/*.jpg \
/home/Imagens/heise.de/*.png \
2>/dev/null
)


A estrutura $(…) levanta um sub-shell e retorna sua saída padrão.

Agora precisamos determinar o tamanho da lista para podermos escolher um índice:
LENGTH=$(wc -l <<< "$IMGLIST")


Temos novamente o sub-shell. O comando wc conta caracteres, palavras e linhas, com a opção -l, apenas linhas. Como cada linha em IMGLIST representa uma imagem, contanto as linhas, contamos as imagens.

Em bash, <<< retorna o conteúdo de uma string como um arquivo virtual, de forma semelhante a <<EOF.

Podemos agora escolher aleatoriamente um índice, maior ou igual a um e menor ou igual à quantidade de imagens.

Para isso usaremos dois recursos: o ambiente aritmético do bash, ((…)), e a variável especial RANDOM, que retorna um valor aleatório entre zero e 32767:
((IMGINDEX = (RANDOM * LENGTH / 32768) + 1))


Por final, podemos usar uma combinação dos comandos tail e head.

O comando tail seleciona todo o «arquivo» a partir de uma determinada linha, e o comando head seleciona n linhas do começo do «arquivo»:
IMGFILE=$(tail +$IMGINDEX <<< "$IMGLIST" | head -n1)


Tendo selecionado a imagem e armazenado seu path na variável IMGFILE, basta carregá-la como papel de parede:
wmsetbg -s "$IMGFILE"


E está pronto nosso script!

Para usá-lo podemos colocá-lo como parte do conteúdo de ~/.xinitrc, ou carregá-lo a partir de ~/.xinitrc com o comando source, ou ainda ajustar o arquivo como executável e chamá-lo a partir do startup do geranciador de janelas escolhido.

[]'s
Cacilhas, La Batalema