Como usar shfmt para formatar melhor os scripts Shell

Conteúdo

Bash Shell

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

Instalando shfmt com snap

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.

shfmt: uma ferramenta compacta para formatação shell

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

Um exemplo prático de shfmt falhando na chamada de função errada

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:

Usando um recuo de dois espaços com shfmt usando a opção -i

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.

Tanto o erro de shfmt quanto o shellcheck falharam

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!

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.