Встроенные комментарии для Bash?


142

Я хотел бы иметь возможность закомментировать один флаг в одной строке команды. У Bash только есть 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 в комментариях. Никакая вложенная оболочка не вызывается.
Алексис

Ответы:


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
Обратите внимание, что вы должны использовать backticks, $(#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

Upvote для ясности. Не знаю, почему это не первый вариант.
Дэвид Табернеро М.

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

25

$(: ...) немного менее уродливо, но все же не хорошо.


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

1
С $ {IFS # ...} никакая вложенная оболочка не вызывается.
Алексис

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

Для отключения такой части команды, как 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.