julho 22, 2019

Um script em Bash para criar scripts em Bash

Como eu costumo fazer muitos scripts em Bash, eu pensei em automatizar pelo menos a parte inicial do processo. Assim, eu terminaria com um arquivo executável, já com a linha #!/bin/env bash no topo, salvo na minha pasta de executáveis (~/.local/bin) e aberto no meu editor de textos preferido (no caso, o Geany).

O resultado foi esse código (explicado nos comentários) que eu utilizo até hoje.

#!/bin/env bash
# O caminho para a minha pasta local
# de executáveis...
script_path="$HOME/.local/bin"
# O editor da minha preferência...
script_editor="geany"
# O nome e o caminho do script...
script_file="$script_path/$1"
# Se o nome do script não foi passado
# como argumento, abortar...
if [[ -z "$@" ]]; then
echo -e "\n\nError!\nUsage: ssgen script_name\n\n"
exit 0;
fi
# Se foi passado, mas o arquivo não existe,
# ele é criado...
if [[ ! -f $script_file ]]; then
echo '#!/usr/bin/env bash' > $script_file
chmod +x $script_file
fi
# Existindo antes ou tendo sido criado agora,
# o script é aberto no editor...
eval $script_editor $script_file
exit 0
view raw blog-ssgen.sh hosted with ❤ by GitHub

Para facilitar ainda mais minha vida, eu resolvi fazer um segundo script usando o aplicativo dmenu, presente no pacote suckless-tools, dos repositórios do Debian. Deste modo, todos os scripts existentes na pasta ~/.local/bin seriam listados em um menu onde poderiam ser selecionados e abertos. Além disso, se eu quisesse criar um novo script, bastaria digitar o nome do novo arquivo no prompt do dmenu.

O resultado é esse da imagem...


E aqui está o script devidamente explicado:

#!/usr/bin/env bash
# Meu caminho de executáveis...
script_path="$HOME/.local/bin"
# Apesar de, no meu caso, o caminho de destino do script
# ser o mesmo local onde está o script gerador de scripts,
# isso pode não ser verdadeiro para outros usuários.
# Então, isso pode ser mudado aqui...
ssgen_path="$script_path"
# Com o "find", eu listo os arquivos executáveis
# na pasta de scripts que não sejam binários...
# ( pois é, eu coloco as minhas AppImages ali também)
list="$(find $script_path -maxdepth 1 -type f -executable \
-exec grep -Iq . {} \; -print \
| sed 's|^'$script_path/'||' \
| sort \
)"
# Carrego essa lista no dmenu, e armazeno
# a entrada selecionada (ou digitada)...
select="$(dmenu -p "Scripts" -l 15 <<< $list)"
# Depois eu executo o gerador de scripts anterior
# passando a saída do menu (nome do arquivo),
# caso algum tenha sido escolhido, como argumento...
if [[ ! -z "$select" ]]; then
eval "$ssgen_path/ssgen $select"
fi
# Pronto, o resto fica por conta do script
# que eu mostrei primeiro.
exit 0

Fique à vontade para usar (por sua conta e risco) e sugerir melhoramentos!

Nenhum comentário:

Postar um comentário

O sistema de comentários do Blogspot é um lixo e praticamente me obriga a liberar ou moderar todos os comentários. Portanto, eu peço perdão antecipadamente caso o seu comentário demore para aparecer.

Mas não se acanhe por causa disso! :-)