Comentarios del script de shell de varias líneas: ¿cómo funciona?

Recientemente, me encontré con un tipo de comentario de varias líneas que nunca había visto antes. Aquí hay un ejemplo de secuencia de comandos:

echo a # : aaa : ddd # echo b 

Esto parece funcionar, incluso vim lo resalta por sintaxis. ¿Cómo se llama este estilo de comentarios y cómo puedo encontrar más información al respecto?

Comentarios

  • ¿Qué pasa si envuelves tu código en función para comentarlo? CommentedOutBlock() { echo "test"; }
  • Como ya han mencionado otros, los comentarios de varias líneas no están disponibles de forma nativa. Entonces uso si es falso; luego < cuántas líneas desea > fi

Responder

Eso no es un comentario de varias líneas. # es un comentario de una sola línea. : (dos puntos) no es un comentario en absoluto, sino un comando integrado de shell que es básicamente un NOP , una operación nula que no hace nada más que devolver verdadero, como true (y por lo tanto establecer $? a 0 como efecto secundario). Sin embargo, dado que es un comando, puede aceptar argumentos y, dado que ignora sus argumentos, en la mayoría de los casos actúa superficialmente como un comentario. El principal problema con esta torpeza es que los argumentos aún se amplían, lo que lleva a una serie de consecuencias no deseadas. Los argumentos aún se ven afectados por errores de sintaxis, las redirecciones aún se realizan, por lo que : > file truncará file y : $(dangerous command) las sustituciones seguirán ejecutándose.

La forma completamente segura menos sorprendente de insertar comentarios en scripts de shell es con #. Cíñete a eso incluso para comentarios de varias líneas. Nunca intente (ab) usar : para comentarios. No existe un mecanismo de comentarios de varias líneas en el shell que sea análogo al formato /* */ de slash-star en C idiomas similares.


En aras de la integridad, pero no porque sea una práctica recomendada, mencionaré que es posible usar here-documents para hacer «comentarios» de varias líneas:

: <<"end_long_comment" This is an abuse of the null command ":" and the here-document syntax to achieve a "multi-line comment". According to the POSIX spec linked above, if any character in the delimiter word ("end_long_comment" in this case) above is quoted, the here-document will not be expanded in any way. This is **critical**, as failing to quote the "end_long_comment" will result in the problems with unintended expansions described above. All of this text in this here-doc goes to the standard input of :, which does nothing with it, hence the effect is like a comment. There is very little point to doing this besides throwing people off. Just use "#". end_long_comment 

Comentarios

  • +1 muy importante para mantenga las comillas simples en la línea <<, que desactiva la sustitución y la expansión.
  • Y como nota adicional, complete los scripts de shell con : para cosas que deberían ser comentarios causarán un consumo adicional de RAM / CPU. Ganó ‘ t mater por cosas simples en su escritorio, pero si ‘ s algo ejecutado cientos o miles de veces por segundo, ‘ ll no haré nada, muy rápido .
  • @bahamat: si ejecutas algo cientos o miles de veces por segundo, espero que no hayas ‘ t escribirlo en shell … = /
  • A veces, usando la utilidad nula para múltiples líneas de el texto puede ser útil. Comenzar el comentario con : <<=cut hace posible escribir POD en scripts de shell; consulte este ejemplo para obtener más detalles . Esto hace posible utilizar perldoc script.sh. Sin embargo, el comentario de varias líneas que se muestra en esta respuesta es algo que definitivamente debería ser un bloque de comentarios (cada línea comienza con # ).
  • Aquí ‘ una buena discusión sobre heredocs, utilizada tanto para comentarios como para otros casos de uso interesantes (incluso incluida la generación de scripts dynaimc): tldp.org/LDP/ abs / html / here-docs.html # EX71C

Responder

No es cualquier estilo de comentario. El : comando incorporado no hace absolutamente nada; se está abusando para comentar aquí.

$ help : :: : Null command. No effect; the command does nothing. Exit Status: Always succeeds. 

Responder

En los primeros shells, los dos puntos eran la única forma de crear comentarios.

Sin embargo, no lo es un comentario verdadero, porque la línea se analiza exactamente de la misma manera que se analiza cualquier otro comando, y eso puede tener efectos secundarios. Por ejemplo:

: ${a:=x} # assigns the value "x" to the variable, "a" : $(command) # executes "command" 

(A veces, los dos puntos se usan únicamente con el propósito de invocar esos efectos secundarios, pero luego no se usan como comentario).

A veces es conveniente usar los dos puntos para comentar una sección de un script:

: " while [ "$n" -ne "$x" ] do : whatever done " 

Esto es un gran ahorro de tiempo en comparación con las anteriores línea con #, especialmente si el comentario es solo temporal.

Comentarios

  • Ese único- El método de comentario de comillas no ‘ t funciona en ninguna sección del script que utilice comillas simples.Y si está usando comillas casi tanto como debería, eso significa que ‘ tendrá comillas simples legítimas esparcidas por todo el script. Es mucho más sencillo usar cualquier editor decente que le permita bloquear comentarios en línea.
  • Tiene razón en que solo funcionará si no hay comillas simples en la sección citada. Sin embargo, un script no necesita tener muchas comillas simples. Al revisar algunos de mis guiones, los encuentro relativamente escasos y muchos podrían ser reemplazados por comillas dobles.
  • La elección de comillas simples o comillas dobles difícilmente debería verse influenciada por algo tan trivial e irrelevante como preocupación sobre si el texto de su script es en sí mismo una cadena válida entre comillas. Las comillas simples se utilizan para evitar expansiones, mientras que las comillas dobles permiten ciertas expansiones y requieren un análisis adicional. Este es el criterio real para determinar cuál usar.
  • Esta es, con mucho, la forma más elegante de hacerlo. Ideal para pequeños bloques de documentación. Me gusta más que /* */ y uf, no ‘ no me hagas empezar con <!-- --> !

Responder

Si su comentario está al final de la secuencia de comandos, puede hacerlo así:

#!/bin/sh echo "hello world" exec true we can put whatever we want here \"\"\$\`!#%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ abcdefghijklmnopqrstuvwxyz{|}~ 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *