¿Hay una herramienta de análisis estático como Lint o Perl:: Critic para scripts de shell?


¿Hay algún comprobador de shell (específicamente bash o ksh) que pruebe los scripts de shell para el estilo, las mejores prácticas, las convenciones de nomenclatura, etc.? (Algo como Pelusa para C, o Perl:: Critic para Perl.)

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

Probablemente no tengo suerte, pero supongo que no hace daño preguntar.

Author: John Conde, 2010-09-08

3 answers

Los proyectos Debian y Ubuntu usan un script checkbashisms, que busca patrones particulares que podrían indicar que alguien está confiando en /bin/sh siendo bash.

Más allá de eso, la mayoría de los shells tienen una opción -n para analizar y reportar errores. Usted podría comprobar su script contra varios shells diferentes para asegurarse de que utiliza solo la sintaxis portable:

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

Editar para agregar : Desde que se escribió esta respuesta, shellcheck se ha escrito, como se sugirió en una versión posterior respuesta. Esto hace un trabajo mucho más minucioso de linting scripts de shell que las sugerencias anteriores.

 31
Author: Brian Campbell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:55:01

Encontré shellcheck: prueba errores comunes en las citas y otras cosas que pasas por alto ("porque funciona").

 40
Author: u0b34a0f6ae,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-12 02:14:08

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

Es instalable a través de rubygems (gem install shlint) como una especie de mordaza, realmente, pero solo necesita perl (para checkbashims) y un shell compatible con POSIX para interpretar el comando shlint en sí. Debería funcionar fuera de la caja en OSX y Ubuntu.

 7
Author: Ross Duggan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-27 23:17:02