sim, a formatação é necessária e ajuda muito a entender códigos complexos. Apesar disto, para aqueles que escrevem scripts de shell muitas vezes, verificar o formato pode se tornar uma tarefa tediosa. Esta postagem mostrará como criar um atalho para o trabalho usando shfmt!
O que é shfmt?
Desenvolvido por Dustin Krysak, shfmt é um formatador, Analisador e intérprete Shell. O próprio projeto é hospedado no GitHub e tem um README claro e um repositório claramente definido. A ferramenta foi desenvolvida em Go e é compatível com shells POSIX, Bash y mksh. Isso torna o shfmt um programa verdadeiramente universal, em vez de ser restrito apenas ao Bash.
Instalando shfmt
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
Instalar shfmt em sua distribuição Linux baseada em RedHat / Yum (como RHEL, Centos e Fedora), execute os seguintes comandos em seu terminal:
Observação: você terá que reiniciar sua máquina (ou saia e faça login novamente) depois de executar o primeiro comando e antes de executar os seguintes comandos.
sudo dnf install snapd
sudo snap install snap-store
sudo snap install shfmt
Em RHEL e Centos, é viável que você também deve instalar o Primeiro o repositório EPEL.
Usando shfmt
Uma vez que o pacote instantâneo é instalado, você pode começar a usar shfmt.
Vamos definir um script escrito com formato muito ruim como test.sh
Como segue:
#!/bin/bash__ echo 'not well formatted line 1' echo 'not well formatted line 2' echo 'this line has extra spaces on the end > ' func() { echo 'more unneeded spaces' echo 'way out' } func ()
há vários problemas com este script, o mais proeminente é o formato do mesmo. Mas também há um erro / erro no script: a chamada de função func
na última linha é seguido por mais parênteses quadrados. Uma chamada de função em Bash (em vez de uma definição de função) deve ter apenas o nome, não colchetes quadrados. É um pouco maior do que a definição de função adequada aconteceu..
Vamos ver o que shfmt
pensar sobre isso.
shfmt test.sh
Embora a saída pareça 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 / representam qualquer linguagem ou elemento equivalente. 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 nos diz que algo mais é esperado.; deve ser seguido por uma declaração. shmft
você 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, mesmo que provavelmente não seja tão completo quanto aquele que escrevemos sobre o uso de shellcheck para encontrar e corrigir erros de script. Ainda assim, muito útil!
Corrigimos nosso erro e agora o script de entrada. test.sh
diz o seguinte:
#!/bin/bash__ echo 'not well formatted line 1' echo 'not well formatted line 2' echo 'this line has extra spaces on the end > ' func() { echo 'more unneeded spaces' echo 'way out' } func
Corremos de novo shfmt
contra o código e você obtém uma saída muito mais adequada e bem formatada:
Excelente. Agora podemos levar este nível mais longe e dizer a você shfmt
nós gostaríamos de usar uma largura de indentação / guia de dois espaços em vez de uma guia completa. Eu sempre escrevo código usando dois espaços como largura de indentação / tabulação, e eu uso um espaço extra onde um comando na próxima linha está intimamente relacionado ao anterior, como um comando contínuo, etc., mesmo que isso não aconteça com frequência. Por mais que 10 anos, Eu descobri que os dois espaços são ideais para projetos pessoais e compartilhados.
Cada projeto deve encontrar sua própria sintaxe ideal, mas observe que se você usar uma guia grande (8 espaços) como o formato apresentado por shfmt
no exemplo acima, seu código pode se tornar mais difícil de ler facilmente.
Vamos definir a largura da indentação / guia em dois espaços usando o -i
opção (que o --help
definido como Sangrando: 0 para cílios (predeterminado),> 0 para o número de espaços): shfmt -i 2 test.sh
que vai renderizar o script na próxima maneira:
#!/bin/bash__ echo 'not well formatted line 1' echo 'not well formatted line 2' echo 'this line has extra spaces on the end > ' func() { echo 'more unneeded spaces' echo 'way out' } func
Excelente! Apesar disto, notamos que shfmt
não percebeu nosso erro deliberado: #!/bin/bash__
não é correto e deve ler #!/bin/bash
ao invés de.
Por isso, ainda há um caso de uso para usar shellcheck para encontrar erros de script ao mesmo tempo que usar shfmt
para melhor formatar scripts. Apesar disto, curiosamente, nesta circunstância particular, inclusivo shellcheck
não percebeu o problema. Esta deficiência foi relatada à equipe do shellcheck, então, no devido tempo, pode ser arranjado.
Se você estiver interessado em aprender mais sobre Linux, você pode conferir a série Bash Automation & Scripting Basics, bem como os Bash Loops: para, enquanto y até Bash Loops: para, enquanto y até y Exportando Variáveis no Bash: as postagens por que e como.
Final
Ser capaz de escrever scripts limpos, bem formatado e sem erros torna-se mais fácil trabalhar quando você usa uma ferramenta de formatação de shell como shfmt
e um verificador de bug / erros 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 os seus scripts e código de acordo com os travessões seleccionados. Desfrutar!