Cómo poner un comentario de línea para un comando multilínea [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Sé cómo escribir un comando multilínea en un script Bash, pero ¿cómo puedo agregar un comentario para cada línea en un comando multilínea?

CommandName InputFiles      \ # This is the comment for the 1st line
            --option1 arg1  \ # This is the comment for the 2nd line
            --option2 arg2    # This is the comment for the 3nd line

Pero desafortunadamente, el carácter comentario después de continuación \ romperá el comando.

Author: dreftymac, 2012-03-01

4 answers

Me temo que, en general, no puedes hacer lo que estás pidiendo. Lo mejor que puede hacer es un comentario en las líneas antes del comando, o un solo comentario al final de la línea de comandos, o un comentario después del comando.

De esta manera no se puede lograr intercalar comentarios dentro de un comando. Las \ s expresan una intención de fusionar líneas, por lo que a todos los efectos está tratando de intercalar comentarios en una sola línea, que no funciona de todos modos porque un \ tiene que estar en el fin de la línea para tener ese efecto.

 44
Author: Perry,
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-10 21:29:51

Así es como lo hago. Esencialmente usando el backtick de Bash sustitución de comandos uno puede colocar estos comentarios en cualquier lugar a lo largo de una línea de comandos larga, incluso si se divide a través de líneas. He puesto el comando echo delante de tu ejemplo para que puedas ejecutar el ejemplo y ver cómo funciona:

echo CommandName InputFiles `#1st comment` \
             --option1 arg1 `#2nd comment` \
             --option2 arg2 `#3rd comment`

Otro ejemplo donde puedes poner varios comentarios en diferentes puntos en una línea:

some_cmd --opt1 `#1st comment` --opt2 `#2nd comment` --opt3 `#3rd comment`
 438
Author: Marwan Alsabbagh,
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-12-06 14:59:48

Puede almacenar los argumentos en una matriz:

args=(InputFiles      # This is the comment for the 1st line
      # You can have whole lines of comments in between, useful for:
      #--deprecated-option # This isn't use any more
      --option1 arg1  # This is the comment for the 2nd line

      # And even blank lines in between for readability
      --option2 arg2  # This is the comment for the 3nd line
     )
CommandName "${args[@]}"

Sin embargo, creo que esto parece un poco hackish si es solo con el propósito de permitir comentarios para cada argumento. Por lo tanto, solo reescribiría el comentario para que se refiera a los argumentos individuales, y lo pondría por encima de todo el comando.

 52
Author: Philipp,
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
2018-02-12 19:27:14

Basado en el comentario de pjh a una otra respuesta a esta pregunta, reemplazando IFS con una variable conocida por no contener caracteres que no sean espacios en blanco.

comment=
who ${comment# This is the command} \
    -u ${comment# This is the argument}
 14
Author: chepner,
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 12:34:45