Спосіб створення багаторядкових коментарів у Bash?


225

Нещодавно я почав вивчати сценарій оболонки, і мені хотілося б прокоментувати набір рядків у сценарії оболонки. Я маю на увазі, як це є у випадку C / Java:

/* comment1
   comment2 
   comment3
*/`

Як я міг це зробити?


2
Ви можете використовувати хеш на зразок: # це коментар.
Мохаммед Таяб

1
Я знаю, але це багато клопоту для багаторядкових.
Enes Malik Turhan

2
Слід зазначити, що наведені нижче відповіді вимагають, щоб :в першому стовпці (без провідних пробілів) знаходилось рядок.
друку

Відповіді:


393

Використовуйте : 'для відкриття та 'закриття.

Наприклад:

: '
This is a
very neat comment
in bash
'

27
:( а також додає велику кількість #
нечитаючої

51
@ jm666 IMHO Ніколи не гарна ідея використовувати слово ніколи, коли ти не маєш уявлення про всі випадки використання.
Зима

19
пояснити: :це скорочення trueта trueне обробляє жодних параметрів. (сторінка вручну:SYNOPSIS true [ignored command line arguments]
phil294

46
Простір між :і 'важливий
бекко

23
Я трохи змінив це для блоків коду, щоб я міг легко вмикати або вимикати код. Моя зміна полягає у використанні # 'в останньому рядку замість однієї цитати. Таким чином я можу поставити сингл #на перший рядок, щоб активувати блок коду. Видаліть #перший рядок, щоб вимкнути код.
JohnMudd

131

Мультилінійний коментар в bash

: <<'END_COMMENT'
This is a heredoc (<<) redirected to a NOP command (:).
The single quotes around END_COMMENT are important,
because it disables variable resolving and command resolving
within these lines.  Without the single-quotes around END_COMMENT,
the following two $() `` commands would get executed:
$(gibberish command)
`rm -fr mydir`
comment1
comment2 
comment3
END_COMMENT

4
Це працює, зараз прийнята відповідь не (для мене).
Фрік

5
Напевно, варто зазначити, що це не коментар як такий. Це гередок, який перенаправляється на команду NOP як багаторядковий рядок. Однією цитатою важливо відключити розв’язання змінних і команд.
Nux

1
@Freek потрібно додати місця
mazs

Я перевірив це в простому скрипті bash, який працює через лінію shebang, #! / Bin / bash в Debian, і це не вдалося. Я пробую кожну відповідь на цій сторінці, і всі вони провалилися, поки я не дійшов до тієї, що нижче. Оскільки вони зазнали невдач, я їх голосую під голосом, і я голосую за той, хто насправді працює належним чином.
PyTis

1
Хороші тести у вашому прикладі. Ведучий :не потрібен. Почніть тільки з <<.
wisbucky

34

Я оновлюю цю публікацію на основі коментарів та інших відповідей, тому коментарі до 22 травня 2020 року більше не можуть застосовуватися.

Bash не забезпечує вбудований синтаксис для багаторядкових коментарів, але є хаки, що використовують наявний синтаксис bash, який "трапляється працювати зараз".

Особисто я думаю, що найпростішим (тобто найменш галасливим, найменш дивним, найпростішим набрати, найбільш явним) є використання цитованого HEREDOC, але дайте зрозуміти, що ви робите, і використовуйте той же маркер HEREDOC скрізь:

<<'### BLOCK COMMENT'
line 1
line 2

line 3
line 4
### BLOCK COMMENT

Одноразове цитування маркера HEREDOC дозволяє уникнути деяких побічних ефектів розбору оболонки, таких як дивні підстановки, які спричинили б збій або вихід, і навіть розбір самого маркера. Тож одиничні котирування дають вам більше свободи на маркері коментарів із відкритим закриттям. Наприклад, нижче використовується потрійний хеш, який пропонує багатолінійний коментар у bash. Це призведе до краху сценарію, якщо одні цитати відсутні. Навіть якщо ви видалите ###, це FOO{}призведе до виходу з ладу скрипту (або спричинить друк поганої заміни, якщо ні set -e), якби не однакові лапки:

set -e

<<'### BLOCK COMMENT'
something something ${FOO{}} something
more comment
### BLOCK COMMENT

ls

Можна, звичайно, просто скористатися

set -e

<<'###'
something something ${FOO{}} something
more comment
###

ls

але намір цього, безумовно, менш зрозумілий читачеві, незнайомому з цією хитрістю.

Сьогодні будь-який хороший редактор дозволяє натиснути ctrl- / або подібне, щоб скасувати / коментувати вибір. Усі точно розуміють це:

# something something ${FOO{}} something
# more comment
# yet another line of comment

Хоча, правда, це не так зручно, як коментар до блоку вище, якщо ви хочете повторно заповнити свої абзаци.

Напевно є й інші прийоми, але, здається, не існує «звичайного» способу це зробити. Було б добре, якби ###>і ###<можна було б додати до bash, щоб вказати початок і кінець блоку коментарів, здається, що це може бути досить просто.


1
Ах, цей легкий / чистий досить, щоб запам'ятати!
Thamme Gowda

1
Як зазначається в попередній відповіді, крім зворотних цитат, послідовність $ (...) також буде розширена, оскільки обидві форми є заміною команд.
Перл Анкар

"Обидва - хаки, щоб вони могли зламати сценарії в майбутньому." Чи можете ви розширити це? Хоча хаки семантично, синтаксично вони є дійсними і не повинні ламатися в майбутньому, якщо тільки Баш не вирішить піти на берсерк і зламати гередок.
Perl Ancar

@perlancar Якщо ми погоджуємось, що хаки - це рішення, які використовують функцію мова / lib, яка абсолютно не пов'язана з проблемою (наприклад, використання heredoc для коментаря або використання параметра в команді "нічого не робити" true), то навіть якщо вони не не ризикуйте порушити (підхід гередока не робить, але версія двокрапки), 1) хаки все-таки придушують наміри: без першого рядка, який натякає на багаторядковий коментар, більшість почухає голову, цікавлячись, що робить цей код; і 2) мають несподівані темні кути (як, наприклад, подвоєння цитати, цитування маркера гередока в певних випадках тощо).
Олівер

@Oliver: Якщо без котирування, змінні можуть мати неприємні побічні ефекти. Уявіть, що ви вклали у свій heredoc-коментар такий рядок, як ${FOO:=bar}або ${FOO{}}. Перший може мати побічний ефект для створення та встановлення змінної FOO, другий призведе до помилкової помилки підстановки ; обох ефектів, яких ви не очікували від реального коментаря.
користувач1934428

24

Прочитавши інші відповіді тут, я придумав наступне, що IMHO дає зрозуміти, що це коментар. Особливо підходить для інформації про використання сценарію:

<< ////

Usage:
This script launches a spaceship to the moon. It's doing so by 
leveraging the power of the Fifth Element, AKA Leeloo.
Will only work if you're Bruce Willis or a relative of Milla Jovovich.

////

Як програміст, послідовність косої риски одразу реєструється в моєму мозку як коментар (навіть якщо косі риски зазвичай використовуються для коментарів до рядків).

Звичайно, "////"це просто струна; кількість косих у префіксі та суфіксі має бути рівним.


3
Я майже пропустивUsage:
РНК

Чудове доповнення до наведеної відповіді. Чесно кажучи, я думаю, що ви могли відредагувати вищевказану відповідь і додати це, замість того, щоб відповідати окремо.
PyTis

Є кілька відповідей "вище" (залежно від порядку сортування). І, відповідаючи окремо, я хотів пояснити обґрунтування вибраного рядка.
noamtm

<< EOF ... EOF
l mingzhi

5

яка ваша думка щодо цього?

function giveitauniquename()
{
  so this is a comment
  echo "there's no need to further escape apostrophes/etc if you are commenting your code this way"
  the drawback is it will be stored in memory as a function as long as your script runs unless you explicitly unset it
  only valid-ish bash allowed inside for instance these would not work without the "pound" signs:
  1, for #((
  2, this #wouldn't work either
  function giveitadifferentuniquename()
  {
    echo nestable
  }
}

привіт, розглядався не як питання, а не відповідь на первісне запитання
Імре

Не добре ІМО. Він вимагає, щоб коментар пройшов аналіз як код оболонки, що є досить обмежуючим.
користувач1934428

3

Ось як я роблю багатолінійні коментарі в bash.

Цей механізм має дві переваги, які я ціную. Одне полягає в тому, що коментарі можуть вкладатись. Інша полягає в тому, що блоки можна ввімкнути, просто прокоментувавши початковий рядок.

#!/bin/bash
# : <<'####.block.A'
echo "foo {" 1>&2
fn data1
echo "foo }" 1>&2
: <<'####.block.B'
fn data2 || exit
exit 1
####.block.B
echo "can't happen" 1>&2
####.block.A

У наведеному вище прикладі коментується блок "B", але частини блоку "A", які не є блоком "B", не коментуються.

Запуск цього прикладу дасть такий результат:

foo {
./example: line 5: fn: command not found
foo }
can't happen

3

Я спробував обрану відповідь, але виявив, що запустив сценарій оболонки, маючи його, вся справа надрукувалася на екран (подібно до того, як зошити юпітера роздруковують все в '''xx'''лапках), і наприкінці з’явилося повідомлення про помилку. Це нічого не робило, але: страшно . Тоді я, редагуючи це, зрозумів, що цитати можуть охоплювати кілька рядків. Отже .. дозволяє просто призначити блок змінній.

x='
echo "these lines will all become comments."
echo "just make sure you don_t use single-quotes!"

ls -l
date

'

Просто не потрібно призначати його змінній, що є побічним ефектом, якого ми не очікуємо від «коментаря». Замініть на x="a", : і у вас такий же ефект без побічного ефекту. Єдиний недолік - те, що коментар тоді не повинен містити жодної цитати. Ось чому я віддаю перевагу використанню гередока, що цитується: З цим, коментер може вибрати відповідний рядок завершення, як йому подобається.
користувач1934428

2

Просте рішення, не дуже розумне:

Тимчасово заблокуйте частину сценарію:

if false; then
    while you respect syntax a bit, please
    do write here (almost) whatever you want.
    but when you are
    done # write
fi

Трохи витончена версія:

time_of_debug=false # Let's set this variable at the beginning of a script

if $time_of_debug; then # in a middle of the script  
    echo I keep this code aside until there is the time of debug!
fi

-2

# Мені подобається лінь і простота. Я б використав # із смішним способом вирішення:

1 ПРЕСС:] знайдіть ctrl + F або cmd + F або будь-яку іншу [, щоб запустити функцію пошуку

2 використовуйте регулярний вираз у полі пошуку, наприклад: (^.+)

3 замініть на: # $1або якщо ви хочете#$1


# Примітка: у вашому редакторі може не бути трьох кроків. У такому випадку використовуйте онлайн-інструмент для регулярних виразів (не можна запропонувати його тут з міркувань політики):

  1. Виберіть, скопіюйте текст, де б ви не були, і вставте його в онлайн-інструмент для регулярних виразів
  2. Використовувати (^.+)як регулярне вираження та / #$1або #\1як схеми заміщення
  3. Виберіть, скопіюйте текст і вставте його туди, де ви почали

# Насолоджуйтесь своїми хешами!


У наші дні багато редакторів мають гарячу клавішу, ctrl+/яка буде перемикати або вимикати коментарі, навіть для кількох рядків. Він також може змінити характер коментаря, залежно від того, якою мовою ви користуєтесь.
ninMonkey
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.