Если документация для команды явно не упоминает, что может содержать комментарии, предположить, что она не может.
То, что я обычно делаю в случаях как это, является сборкой массив arguments (который может взять комментарии), и затем передайте тех, которые rsync, например.
#!/bin/bash
rsync_args=(
# Show me what you're doing
--itemize-changes
# All HTML and resources
*.html *.css *.js
# All PHP source code
*.php
# To the live server
live:
)
rsync "${rsync_args[@]}";
Если я понимаю Вас правильно, Вы хотите добавить комментарии о файлах в списке файлов. Это не возможно, потому что, когда оболочка встречается с # символом, она проигнорирует весь оставшийся символ на командной строке. Один способ достигнуть этого состоит в том, чтобы использовать rsync с - files-from=filelist аргумент. Файл списка файлов может содержать комментарии.
С другой стороны, если Вы захотите встроить # символы в имя файла, то затем это будет работать. Например, с ударом:
touch a#b
touch 'a #b'
touch "a #b"
Ответ Ignacio Vazquez-Abrams является самым безопасным, но если Вы действительно хотите сделать это (как я делаю в некоторых случаях), простое обходное решение может легко добраться по крайней мере отчасти там путем контакта с # comments
которые поднимают всю строку.
Вещи могут стать немного непростыми, если Вы хотите обработать комментарии, которые следуют за реальными линиями передачи данных списка, если Вы не уверены, что Ваши линии передачи данных содержат не встроенный #
символы.
Можно использовать замену процесса и простой сценарий помощника.
Вот некоторые примеры. grc
прежде diff
генерирует окрашенный вывод.
Я использовал функции удара, но можно, конечно, сохранить их в файл сценария.
# nocom handles comment-only lines (ie. no dat)
# it ignores any # chars embedded in your data lines.
#
nocom() { sed -e '/^[[:space:]]*#/d' "$1"; }
# NOCOM handles handles comments which occurr after your data
# as well as comment-only lines.
# Do not use NOCM unless you are CERTAIN that your data
# lines contain no # chars.
#
NOCOM() { sed -n '/^[[:space:]]*#/d; s/^\([^#][^#]*[^[:space:]]\)[[:space:]]*#.*/\1/; p' "$1"; }
printf '# a bit of hokus-pokus
# you see the coments here,
# but the calling program will not.
$HOME/bin/abra
$HOME/bin/kadabra # comment after data
$HOME/bin/sim# another comment after data
' >file
echo == nocom ==
cat <(nocom "file")
echo == NOCOM ==
cat <(NOCOM "file")
echo == diff ==
grc diff "file" <(NOCOM "file")
Вот вывод:
== nocom ==
$HOME/bin/abra
$HOME/bin/kadabra # comment after data
$HOME/bin/sim# another comment after data
== NOCOM ==
$HOME/bin/abra
$HOME/bin/kadabra
$HOME/bin/sim
== diff ==
1,3d0
< # a bit of hokus-pokus
< # you see the coments here,
< # but the calling program won't.
5,6c2,3
< $HOME/bin/kadabra # comment after data
< $HOME/bin/sim# another comment after data
---
> $HOME/bin/kadabra
> $HOME/bin/sim