2010-09-08 13 views
43

¿Hay controles de shell (específicamente bash o ksh) que prueben las secuencias de comandos de shell para el estilo, las mejores prácticas, las convenciones de nomenclatura, etc.? (Algo así como Lint for C, o Perl :: Critic for Perl.)¿Hay alguna herramienta de análisis estático como Lint o Perl :: Critic para scripts de shell?

Sé con ksh que puede hacer la comprobación de sintaxis ejecutando ksh -n script.ksh pero esperaba algo más que solo comprobación de sytax, algo que analiza/analiza el código real?

Probablemente no haya tenido suerte, pero creo que no hace daño preguntar.

Respuesta

30

Los proyectos de Debian y Ubuntu usan un script checkbashisms, que busca patrones particulares que pueden indicar que alguien confía en /bin/sh como bash.

Más allá de eso, la mayoría de las shells tienen una opción -n para analizar e informar errores. Usted puede comprobar su secuencia de comandos en varios proyectiles diferentes para asegurarse de que utiliza sólo la sintaxis portátil:

for shell in zsh ksh bash dash sh 
do 
    echo "Testing ${shell}" 
    ${shell} -n my_script.sh 
done 

de edición para agregar: Después de haber escrito esta respuesta, shellcheck se ha escrito, como se sugiere in a later answer. Esto hace un trabajo mucho más completo de borrado de guiones de shell que las sugerencias anteriores.

+0

Genial: ¡ese script parece prometedor! Y a juzgar por mi falta de encontrar algo más, y la falta de respuestas, diría que eso es probablemente lo único que hace este tipo de cosas. ¡Muchas gracias! – BrianH

+1

¿Soy yo o esta opción no está en la página de manual de bash ni zsh? – log0

+1

'bash -n' es como' set -n'. – fossilet

37

I found shellcheck: prueba errores comunes en las citas y otras cosas que pasa por alto ("porque funciona").

+1

Es una lástima que dependa de Haskell. Es bueno, pero Haskell es una gran dependencia. –

+2

@Shurane - la dependencia es necesaria solo para construir, no para ejecutar el ejecutable. –

+2

Parece que la única dependencia es un navegador. – msanford

7

Escribí shlint para envolver checkbashims y las otras opciones básicas de pelusas disponibles para las conchas presentadas en la respuesta de Brian.

Se puede instalar a través de rubygems (gem install shlint) como una especie de mordaza, de verdad, pero solo necesita perl (para checkbashims) y una coraza compatible con POSIX para interpretar el comando shlint. Debería funcionar de la caja en OSX y Ubuntu.

Cuestiones relacionadas