¿Es posible verificar una sintaxis de script bash sin ejecutarla?
Usando Perl, puedo correr perl -c 'script name'
. ¿Hay algún comando equivalente para los scripts bash?
¿Es posible verificar una sintaxis de script bash sin ejecutarla?
Usando Perl, puedo correr perl -c 'script name'
. ¿Hay algún comando equivalente para los scripts bash?
Respuestas:
bash -n scriptname
Tal vez una advertencia obvia: esto valida la sintaxis pero no verificará si su script bash intenta ejecutar un comando que no está en su camino, como en ech hello
lugar de echo hello
.
set
.
if ["$var" == "string" ]
lugar deif [ "$var" == "string" ]
type [
dice "[es un shell incorporado". Finalmente, delega en el test
programa, pero también espera un paréntesis de cierre. Entonces es como if test"$var"
, que no es lo que el autor quiso decir, pero es sintácticamente válido (digamos que $ var tiene un valor de "a", luego veremos "bash: testa: comando no encontrado"). El punto es que sintácticamente, no falta espacio.
[
solo se invoca en este caso si se $var
expande a una cadena vacía . Si se $var
expande a una cadena no vacía , [
se concatena con esa cadena y Bash lo interpreta como un nombre de comando (no un nombre de función ) y, sí, eso es sintácticamente válido, pero, como usted dice, obviamente no es la intención. Si usa en [[
lugar de [
, aunque [[
sea una palabra clave de shell (en lugar de una incorporada), obtendrá el mismo resultado, porque la concatenación de cadena no intencionada todavía anula el reconocimiento de la palabra clave.
["$var"
es sintácticamente una expresión válida de nombre de comando ; de manera similar, los tokens ==
y "$string"
son argumentos de comando válidos . (Generalmente, incorporado [
se analiza con comando sintaxis, mientras que [[
- como una concha palabra clave - se analiza de manera diferente). El orden interna del shell [
no no delegar al " test
programa" (utilidad externa): bash
, dash
, ksh
, zsh
todos tienen incorporado versiones de ambos [
ytest
, y no llaman a sus contrapartes de servicios externos.
El tiempo lo cambia todo. Aquí hay un sitio web que proporciona verificación de sintaxis en línea para script de shell.
Descubrí que es muy poderoso detectar errores comunes.
ShellCheck es una herramienta de análisis estático y de enlace para scripts sh / bash. Se centra principalmente en el manejo de errores y dificultades típicas de sintaxis de nivel principiante e intermedio donde el shell solo da un mensaje de error críptico o un comportamiento extraño, pero también informa sobre algunos problemas más avanzados donde los casos de esquina pueden causar fallas tardías.
¡El código fuente de Haskell está disponible en GitHub!
apt-get install shellcheck
trusty-backports
.
También habilito la opción 'u' en cada script de bash que escribo para hacer alguna comprobación adicional:
set -u
Esto informará el uso de variables no inicializadas, como en el siguiente script 'check_init.sh'
#!/bin/sh
set -u
message=hello
echo $mesage
Ejecutando el script:
$ check_init.sh
Informará lo siguiente:
./check_init.sh[4]: mensaje: parámetro no establecido.
Muy útil para detectar errores tipográficos.
set -u
aunque esto realmente no responde la pregunta, porque debe ejecutar el script para obtener el mensaje de error. Ni siquiera bash -n check_init.sh
muestra esa advertencia
sh -n script-name
Ejecuta esto. Si hay errores de sintaxis en el script, entonces devuelve el mismo mensaje de error. Si no hay errores, sale sin dar ningún mensaje. Puede verificar de inmediato mediante el uso echo $?
, que devolverá la 0
confirmación exitosa sin ningún error.
A mí me funcionó bien. Corrí en el sistema operativo Linux, Bash Shell.
sh -n
probablemente no verificará que el script sea válido Bash script. Podría dar falsos negativos. sh
es una variante de shell Bourne que generalmente no es Bash. Por ejemplo, en Ubuntu Linux realpath -e $(command -v sh)
da / bin / dash
De hecho, verifico todos los scripts de bash en el directorio actual en busca de errores de sintaxis SIN ejecutarlos con la find
herramienta
Ejemplo:
find . -name '*.sh' -exec bash -n {} \;
Si desea usarlo para un solo archivo, simplemente edite el comodín con el nombre del archivo.
Hay un complemento BashSupport para IntelliJ IDEA que verifica la sintaxis.
.sh
u otra extensión asociada con los scripts de Bash, que es el caso si genera los scripts usando alguna herramienta de plantilla como ERB (luego terminan con .erb
). ¡Vote por youtrack.jetbrains.com/issue/IDEA-79574 si desea que se solucione!
Si necesita en una variable la validez de todos los archivos en un directorio (git pre-commit hook, build lint script), puede capturar la salida stderr de los comandos "sh -n" o "bash -n" (vea otro respuestas) en una variable y tener un "if / else" basado en eso
bashErrLines=$(find bin/ -type f -name '*.sh' -exec sh -n {} \; 2>&1 > /dev/null)
if [ "$bashErrLines" != "" ]; then
# at least one sh file in the bin dir has a syntax error
echo $bashErrLines;
exit;
fi
Cambia "sh" por "bash" según tus necesidades