Header Ads

Como usar shfmt para formatar melhor os scripts de shell

Sim, a formatação é necessária e ajuda tremendamente na compreensão de códigos complexos. No entanto, para aqueles que escrevem scripts de shell com frequência, verificar a formatação pode se tornar uma tarefa entediante. Este artigo mostrará como criar um atalho para o trabalho usando shfmt!

O que é shfmt?

Desenvolvido por Dustin Krysak, shfmt é um formatador, analisador e interpretador Shell. O projeto em si está hospedado no GitHub e tem um README claro e um repositório apresentado de forma limpa. A ferramenta foi desenvolvida em Go e suporta os shells POSIX, Bash e mksh. Isso torna o shfmt um programa verdadeiramente universal, em vez de ser restrito apenas ao Bash.

Instalando o shfmt

Para instalar shfmt em sua distribuição Linux habilitada para snap (como Ubuntu e Mint), execute o seguinte comando em seu terminal:

 sudo snap install shfmt 

Para instalar shfmt em sua distribuição Linux baseada em RedHat / Yum (como RHEL, Centos e Fedora), execute os seguintes comandos em seu terminal:

Nota: você terá que reinicializar sua máquina (ou fazer logout e fazer login novamente) após executar o primeiro comando e antes de executar os próximos comandos.

 sudo dnf install snapd sudo snap install snap-store sudo snap install shfmt 

No RHEL e Centos, você também pode ter que instalar o repositório EPEL primeiro.

Usando shfmt

Assim que o pacote snap for instalado, você pode começar a usar shfmt.

Vamos definir um script muito mal formatado e escrito como test. sh da seguinte maneira:

 #! / bin / bash__ echo 'linha 1 não bem formatada' echo 'linha 2 não bem formatada' echo 'esta linha tem espaços extras no final > 'func () {echo' mais espaços desnecessários 'echo' way out '} func () 

Existem vários problemas com este script, o mais proeminente é a formatação do mesmo. Mas também há um erro / bug no script: A chamada de função func na última linha é seguida por mais colchetes. Uma chamada de função no Bash (em vez de uma definição de função) deve ter apenas o nome, não os colchetes. É um pouco mais alto que a definição de função adequada aconteceu.

Vamos ver o que shfmt pensa sobre isso.

 shfmt test. sh 

Considerando que a saída parece um pouco enigmática, observe que o termo foo (usado aqui) e bar (não usado aqui agora) são frequentemente usados ​​em círculos de TI para indicar / representar qualquer idioma ou elemento semelhante. foo aqui realmente se refere a func.

Mesmo assim, a mensagem permanece um pouco enigmática até que percebamos, olhando para a última linha, que o que realmente está acontecendo é o início de uma definição de função (e não uma chamada de função) porque os dois colchetes foram incluídos. Isso explica por que a mensagem está nos dizendo que algo mais é esperado; deve ser seguido por uma declaração. shmft está procurando aqui por algo como func () {some_command [s]; }.

Bingo! Isso aumenta a funcionalidade do shfmt para ser uma ferramenta de verificação / validação de script de shell, embora provavelmente longe de uma ferramenta abrangente como a que escrevemos ao usar shellcheck para encontrar e corrigir bugs de script. Mesmo assim, é muito útil!

Corrigimos nosso bug e agora o script de entrada test. sh lê o seguinte:

 #! / bin / bash__ echo 'linha 1 não bem formatada' echo 'linha 2 não bem formatada' echo 'esta linha tem espaços extras no final > 'func () {echo' mais espaços desnecessários 'echo' saída '} func 

Novamente executamos shfmt no código e recebemos uma saída muito mais adequada e bem formatada:

Ótimo. Agora podemos levar isso um nível mais longe e indicar ao shfmt que gostaríamos de usar uma largura de recuo / tabulação de dois espaços em vez de uma tabulação completa. Eu sempre escrevo código usando dois espaços como recuo / largura da tabulação e uso um espaço adicional onde um comando na próxima linha se relaciona intimamente com o anterior, como um comando contínuo etc. embora isso não aconteça com frequência. Ao longo de mais de 10 anos, descobri que os dois espaços são ideais para projetos pessoais e compartilhados.

Todos e cada projeto tem que encontrar sua própria sintaxe ideal, mas observe que se você usar uma guia grande (8 espaços) como a formatação apresentada por shfmt no exemplo acima, seu o código pode se tornar mais difícil de ler facilmente.

Definiremos o recuo / largura da tabulação para dois espaços usando a opção -i (que o --help define como indentação: 0 para tabulações (padrão), > 0 para número de espaços): shfmt -i 2 test . sh que renderizará o script da seguinte maneira:

 #! / bin / bash__ echo 'linha 1 não bem formatada' echo 'linha 2 não bem formatada' echo 'esta linha tem espaços extras no final > 'func () {echo' mais espaços desnecessários 'echo' saída '} func 

Ótimo! No entanto, observamos que shfmt não pegou nosso erro deliberado: #! / Bin / bash__ não está correto e deveria ler #! / Bin / bash em vez disso.

Portanto, ainda há um caso de uso para usar shellcheck para encontrar erros de script, além de usar shfmt para formatar scripts melhor. No entanto, curiosamente, neste caso específico, até mesmo o shellcheck não percebeu o problema. Essa deficiência foi relatada à equipe do shellcheck, portanto, no devido tempo, isso pode ser corrigido.

Se estiver interessado em aprender mais sobre o Linux, você pode revisar o Bash Automation & Scripting Basics Series, bem como os Bash Loops: for, while e until Bash Loops: for, while e until e Exportar variáveis ​​no Bash: os artigos Por que e Como.

Concluindo

Ser capaz de escrever scripts limpos, bem formatados e sem bugs torna-se uma tarefa mais fácil quando você usa uma ferramenta de formatação de shell como shfmt e um verificador de bug / erro como shellcheck. Mesmo assim, como vimos, algumas coisas podem passar despercebidas até o momento em que você executa o script pela primeira vez. shfmt é um utilitário pequeno, mas eficaz, que o ajudará a formatar seus scripts e código de acordo com os recuos selecionados. Aproveite!

Nenhum comentário