Вбудовані коментарі до Bash?


142

Я хотів би мати можливість прокоментувати один прапор в однорядковій команді. Баш, здається, має лише from # till end-of-lineкоментарі. Я дивлюся на хитрощі, як:

ls -l $([ ] && -F is turned off) -a /etc

Це некрасиво, але краще, ніж нічого. Чи є кращий спосіб?

Наступне, здається, працює, але я не впевнений, чи є він портативним:

ls -l `# -F is turned off` -a /etc

#commentТрюк також згадується тут: stackoverflow.com/questions/9522631 / ...
Юха Palomäki

1
Перейшовши за посиланням, згаданим @Juha Palomäki, є цей чудовий трюк, який ${IFS#comment}запровадив @pjh у коментарях. Жодна підкольора не викликається.
alexis

Відповіді:


110

Мої переваги:

Коментуючи сценарій Bash

Це матиме певні накладні витрати, але технічно це відповість на ваше запитання

echo abc `#put your comment here` \
     def `#another chance for a comment` \
     xyz etc

А конкретно для трубопроводів є більш чисте рішення, без накладних витрат

echo abc |        # normal comment OK here
     tr a-z A-Z | # another normal comment OK here
     sort |       # the pipelines are automatically continued
     uniq         # final comment

Як поставити коментар до рядка для багаторядкової команди


3
Зауважте, що вам доведеться використовувати задні посилання, $(#comment)не працює.
funroll

1
Деякі версії будуть розглядатись )як частина самого коментаря. Більшість проблем bash пов'язані з ретро-сумісністю зі старими версіями, і одна загальна стратегія - використовувати найстаріше можливе рішення.
Рафарейно

2
Зауважте, це не справжній коментар: true && `# comment` && trueце дійсне вираження. Справжній коментар породжує щось на кшталт: syntax error near unexpected token && '`
Себастьян Вагнер

Ви маєте рацію @sebastianwagner, зауважте також, що це може вийти з ладу короткого замикання або чогось подібного, але я думаю, що це так добре, як ми можемо отримати, не ускладнюючи багато речей. Для мене це знак того, що людині потрібна краща мова, але вона може зробити чудово, підтримуючи вже вбудований код з такими "коментарями" для його документування.
Рафареїно

Дякую, що допомогло мені!
xiarnousx

58

Я вважаю найпростішим (і найчитабельнішим) просто скопіювати рядок і прокоментувати оригінальну версію:

#Old version of ls:
#ls -l $([ ] && -F is turned off) -a /etc
ls -l -a /etc

Підвищення ясності. Не знаю, чому це не перший варіант.
Девід Табернеро М.

але тоді це не в рядку? я гадаю, що справедливо сказати, що необхідність робити речі, які не підтримуються
башем,

25

$(: ...) трохи менше потворно, але все ж не добре.


2
За допомогою цього синтаксису ви запускаєте підгалузь, коментар призначений для поліпшення редагованості, не змінюючи поведінки коду, але час, коли можна запускати / закінчувати цю підшкірну оболонку, зробить ваш код повільнішим (якщо не менше), чому б не використовувати лише двокрапку на початку нового рядка?
Рафарейно

1
З $ {IFS # ...} жодна підкольора не викликається.
alexis

3
@Rafareino: так. Але якщо серйозно, то у 95% застосунків ця накладні витрати взагалі не матимуть значення. У багатьох випадках, коли це має значення, напевно, було б корисно використовувати мову швидше, ніж Bash.
близько

... проблема полягає в тому, що $(: ...)синтаксис насправді не дозволяє вбудовувати коментарі: тоді як echo "foo" `# comment` "bar"припиняється коментар на другому зворотному боці, передбачуваний еквівалент echo "foo" $(: # comment) "bar"нічого не аналізує за #.
близько


4

Ось моє рішення для вбудованих коментарів між декількома командними конвеєрами.

Приклад коментованого коду:

    #!/bin/sh
    cat input.txt \
    | grep something \
    | sort -r

Рішення для коментаря до труби (за допомогою функції помічника):

    #!/bin/sh
    pipe_comment() {
        cat - 
    }
    cat input.txt \
    | pipe_comment "filter down to lines that contain the word: something" \
    | grep something \
    | pipe_comment "reverse sort what is left" \
    | sort -r

Або якщо ви віддаєте перевагу, ось те саме рішення без допоміжної функції, але це трохи менше:

    #!/bin/sh
    cat input.txt \
    | cat - `: filter down to lines that contain the word: something` \
    | grep something \
    | cat - `: reverse sort what is left` \
    | sort -r

7
На відміну від цього, якщо ви пересунете символ труби до кінця попереднього рядка, ви можете позбутися від похмурого зворотно-косого рядка.
tripleee

3

Більшість команд дозволяють аргументуватись в будь-якому порядку. Просто перемістіть коментовані прапори до кінця рядка:

ls -l -a /etc # -F is turned off

Потім, щоб увімкнути його, просто скаментуйте та видаліть текст:

ls -l -a /etc -F

1
чорт, я додав #без жодного пробілу після команди. спасибі!
асгс

1

Якщо ви знаєте, що змінна порожня, ви можете використовувати її як коментар. Звичайно, якщо він не порожній, він зіпсує вашу команду.

ls -l $ {1 # -F вимкнено} -a / тощо

§ 10.2. Параметр Заміна


Використовуйте ${name:=comment}для безпеки.
can-ned_food

1

Для відключення частини команди, як-от a && b, я просто створив порожній скрипт, xякий знаходиться на шляху, так що я можу робити такі речі, як:

mvn install && runProject

коли мені потрібно будувати, і

x mvn install && runProject

коли ні (використання Ctrl + Aта Ctrl + Eперехід до початку та кінця).

Як зазначається в коментарях, інший спосіб зробити це вбудований Bash :замість x:

$  : Hello world, how are you? && echo "Fine."
Fine.

2
Такий вбудований вже існує: :Як і в:string; of; commands; : disabled; enabled;
xenithorb

Ще краще :) Спасибі
Ондра Жижка

-1

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

О, є один виняток - це діалект SQL, який я зазвичай використовую, який використовує '{comments}'. Іноді я напишу:

CREATE UNIQUE INDEX u1_table ON Table(...);
CREATE {DUPS} INDEX d1_table ON Table(...);

Але навіть це розтяжка.

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