Как добавить комментарий для многострочной команды [duplicate]

239

Я знаю, как написать многострочную команду в Bash script, но как добавить комментарий для каждой строки в многострочной команде?

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

Но, к сожалению, комментарий после символа продолжения \ нарушит команду.

  • 0
    Скопируйте блок кода в закомментированный / аннотированный блок рядом с ним, если вы обновляете код, просто не забудьте обновить блок комментария.
  • 0
    L @@ K на ответ Марвана. Это совершенно гениально. Это должен быть принятый ответ.
Показать ещё 2 комментария
Теги:
comments

4 ответа

47
Лучший ответ

Я боюсь, что, в общем, вы не можете делать то, о чем просите. Лучшее, что вы можете сделать, это комментарий к строкам перед командой или один комментарий в конце командной строки или комментарий после команды.

Таким образом, вы не можете интерпретировать комментарии внутри команды. \ выражают намерение объединить строки, поэтому для всех целей и задач вы пытаетесь просмотреть комментарии в одной строке, что не работает, так как \ должен быть в конце строки, чтобы имеют этот эффект.

  • 3
    Не говоря уже о том, что « \ s эффективно объединяет эти строки» даже не правильно, проблема в том, что обратный слеш должен немедленно предшествовать символу новой строки, чтобы избежать его, тогда как с cmd \ # comment есть пробел и комментарий между обратная косая черта и новая строка.
  • 0
    Принятый ответ должен быть ниже Марвана.
Показать ещё 4 комментария
421

Вот как я это делаю. По существу, используя Bash backtick подстановка команд, можно поместить эти комментарии в любом месте вдоль длинной командной строки, даже если она разделена по строкам. Я поставил команду echo перед вашим примером, чтобы вы могли выполнить этот пример и посмотреть, как он работает:

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

Другой пример, где вы можете поместить несколько комментариев в разных точках в одной строке:

some_cmd --opt1 `#1st comment` --opt2 `#2nd comment` --opt3 `#3rd comment`
  • 8
    Он работает даже в под-командах: "echo` # 1` foo \ (newline) | perl -ne `# 2` 'print'" ... именно то, что мне нужно!
  • 171
    Это самое гениальное злоупотребление заменой, которое я видел!
Показать ещё 16 комментариев
55

Вы можете хранить аргументы в массиве:

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[@]}"

Однако я думаю, что это выглядит немного хакерским, если только для того, чтобы давать комментарии для каждого аргумента. Поэтому я просто переписал комментарий, чтобы он ссылался на отдельные аргументы и помещал его над всей командой.

  • 3
    Это работает для чего-то простого, такого как пример OP, но не поддерживает > и < и | и || и && и так далее.
  • 0
    @ Филипп Хммм, спасибо. Это хороший обходной путь. но я боюсь , что это будет немного запутанным , если мой --option arg имеет как ' и " .
Показать ещё 5 комментариев
14

На основе pjh комментировать еще один ответ на этот вопрос, заменив IFS на переменную, которая, как известно, не содержит небелых пробелов.

comment=
who ${comment# This is the command} \
    -u ${comment# This is the argument}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню