комментарии среди параметров в BASH - PullRequest
6 голосов
/ 10 июня 2011

Я хочу включить комментарии к параметрам команды, например:

sed -i.bak -r \
    # comment 1
    -e 'sed_commands' \
    # comment 2
    -e 'sed_commands' \
    # comment 3
    -e 'sed_commands' \
    /path/to/file

Приведенный выше код не работаетЕсть ли другой способ встраивания комментариев в строку параметров?

Ответы [ 7 ]

9 голосов
/ 10 июня 2011

Если вам действительно нужны аргументы комментария, попробуйте следующее:

ls $(
    echo '-l' #for the long list
    echo '-F' #show file types too
    echo '-t' #sort by time
)

Это будет эквивалентно:

ls -l -F -t

echo - встроенная оболочка, поэтому не выполняетсявнешние команды, так что это достаточно быстро.Но, в любом случае, это безумие.

или

makeargs() { while read line; do echo ${line//#*/}; done }
ls $(makeargs <<EOF
        -l # CDEWDWEls
        -F #Dwfwef
EOF
)
2 голосов
/ 10 июня 2011

Вы могли бы вызывать sed несколько раз вместо передачи всех аргументов одному процессу:

sed sed_commands |             # comment 1
    sed sed_commands |         # comment 2
    sed sed_commands |         # comment 3
    sed sed_commands           # final comment

Это, очевидно, более расточительно, но вы можете решить, что три дополнительных процесса sed являются приемлемым компромиссом для удобства чтения и переносимости (на точку зрения @ shellter о поддержке комментариев внутри команд sed). Зависит от вашей ситуации.

ОБНОВЛЕНИЕ: вам также придется скорректировать, если вы изначально намеревались редактировать файлы на месте, как подразумевает ваш аргумент -i. Этот подход потребует конвейера.

2 голосов
/ 10 июня 2011

Я бы рекомендовал использовать более длинные текстовые блоки для вашего сценария sed, т.е.

sed -i.bak '
    # comment 1
    sed_commands
    # comment 2
    sed_commands
    # comment 3
    sed_commands
' /path/to/file

К сожалению, встроенные комментарии в блоках сценариев sed не всегда поддерживаются. Версия sun4 позволит вам оставить комментарий в первой строке, но нигде больше. AIX sed либо не допускает никаких комментариев, либо использует другой символ, кроме # для комментариев. Ваши результаты могут отличаться.

Надеюсь, это поможет.

1 голос
/ 03 мая 2016

Хотя ветка довольно старая, я нашел ее по тому же вопросу, как и другие.Вот мое решение этой проблемы:

Вам нужны комментарии, так что если вы посмотрите на свой код гораздо позже, вы, вероятно, получите представление о том, что вы на самом деле сделали, когда писали код.У меня просто та же проблема при написании моего первого скрипта rsync, который имеет много параметров, которые также имеют побочные эффекты.

Сгруппируйте ваши параметры, которые принадлежат теме, и поместите их в переменную, котораясоответствующее имя.Это позволяет легко определить, какой параметр управляет.Это ваш короткий комментарий.Кроме того, вы можете поместить комментарий над объявлением переменной, чтобы увидеть, как вы можете изменить поведение.Это длинный комментарий к версии.

Вызовите приложение с соответствующими переменными параметров.

## Options
# Remove --whole-file for delta transfer
sync_filesystem=" --one-file-system \
                  --recursive       \
                  --relative        \
                  --whole-file      \ " ;

rsync \
      ${sync_filesystem}  \
      ${way_more_to_come} \
      "${SOURCE}"         \
      "${DESTIN}"         \

Хороший обзор, легко редактируемые и похожие комментарии в параметрах.Это требует больше усилий, но, следовательно, имеет более высокое качество.

1 голос
/ 11 июня 2011

Нет.

Если вы поставите \ перед #, это будет экранировать символ комментария, и у вас больше не будет комментария.

Если вы поставите \ после #, это будет частью комментария, и вы больше не будете выходить из новой строки.

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

1 голос
/ 10 июня 2011

Нет способа сделать то, что вы хотите сделать в shell plus и sed.Я помещаю комментарии перед сценарием sed, например:

# This is a remarkably straight-forward SED script
# -- When it encounters an end of here-document followed by
#    the start of the next here document, it deletes both lines.
#    This cuts down vastly on the number of processes which are run.
# -- It also does a substitution for XXXX, because the script which
#    put the XXXX in place was quite hard enough without having to
#    worry about whether things were escaped enough times or not.
cat >$tmp.3 <<EOF
/^!\$/N
/^!\\ncat <<'!'\$/d
s%version XXXX%version $SOURCEDIR/%
EOF

# This is another entertaining SED script.
# It takes the output from the shell script generated by running the
# first script through the second script and into the shell, and
# converts it back into an NMD file.
# -- It initialises the hold space with --@, which is a marker.
# -- For lines which start with the marker, it adds the pattern space
#    to the hold space and exchanges the hold and pattern space.  It
#    then replaces a version number followed by a newline, the marker
#    and a version number by the just the new version number, but
#    replaces a version number followed by a newline and just the
#    marker by just the version number.  This replaces the old version
#    number with the new one (when there is a new version number).
#    The line is printed and deleted.
# -- Note that this code allows for an optional single word after the
#    version number.  At the moment, the only valid value is 'binary' which
#    indicates that the file should not be version stamped by mknmd.
# -- On any line which does not start with the marker, the line is
#    copied into the hold space, and if the original hold space
#    started with the marker, the line is deleted.  Otherwise, of
#    course, it is printed.
cat >$tmp.2 <<'EOF'
1{
x
s/^/--@/
x
}
/^--@ /{
H
x
s/\([   ]\)[0-9.][0-9.]*\n--@ \([0-9.]\)/\1\2/
s/\([   ]\)[0-9.][0-9.]*\([     ][      ]*[^    ]*\)\n--@ \([0-9.][0-9.]*\)/\1\3\2/
s/\([   ][0-9.][0-9.]*\)\n--@ $/\1/
s/\([   ][0-9.][0-9.]*[         ][      ]*[^    ]*\)\n--@ $/\1/
p
d
}
/^--@/!{
x
/^--@/d
}
EOF

В файле есть еще один сценарий sed длиной около 40 строк (помеченный как «развлекательный»), хотя и примерно в половине.Строки - это просто встроенный сценарий оболочки, добавленный к выводу.Я не менял сценарий оболочки, содержащий этот материал, 13 лет, потому что (а) он работает и (б) сценарии sed пугают меня безумно.(Формат NMD содержит имя файла и номер версии, разделенные пробелом, и иногда слово тега «двоичный» вместо номера версии, а также строки комментариев и пустые строки.)

Вам не нужно пониматьчто делает скрипт - но комментирование перед скриптом - лучший способ документировать сценарии sed.

0 голосов
/ 27 октября 2017

Я предложу другой способ, который работает, по крайней мере, в некоторых случаях:

Допустим, у меня есть команда:

foo --option1 --option2=blah --option3 option3val /tmp/bar`

Я могу написать это так:

options=(
--option1
--option2=blah
--option3 option3val
)

foo ${options[@]} /tmp/bar

Теперь допустим, я хочу временно удалить второй вариант. Я могу просто прокомментировать это:

options=(
--option1
# --option2=blah
--option3 option3val
)

Обратите внимание, что этот метод может не работать, если вам требуется экстренное экранирование или цитирование. Я сталкивался с некоторыми проблемами в прошлом, но, к сожалению, на данный момент не помню подробностей: (* ​​1012 *

Однако в большинстве случаев этот метод работает хорошо. Если вам нужны встроенные пробелы в параметре, просто заключите строку в кавычки, как обычно.

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