A menos que a documentação do comando mencione explicitamente que pode conter comentários, suponha que não seja possível.
Alguns comandos, como rsync
, aceitam listas como argumento. Esses arquivos podem conter comentários unix como #
?
A menos que a documentação do comando mencione explicitamente que pode conter comentários, suponha que não seja possível.
O que eu costumo fazer em casos como esse, é construir uma matriz de argumentos (que pode receber comentários) e depois passá-los para o rsync, por exemplo.
#!/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[@]}";
Se eu entendi corretamente, você deseja adicionar comentários sobre arquivos na lista de arquivos. Isso não é possível, porque quando o shell encontrar o caractere #, ele ignorará todos os caracteres remanescentes na linha de comando. Uma maneira de conseguir isso é usar o rsync com o argumento --files-from = filelist. O arquivo filelist pode conter comentários.
Por outro lado, se você quiser inserir # caracteres no nome do arquivo, isso funcionará. Por exemplo, com bash:
touch a#b
touch 'a #b'
touch "a #b"
Ignacio Vazquez-Abrams resposta é a mais segura, mas se você realmente quiser fazê-lo (como eu faço em alguns casos), uma solução simples pode facilmente ficar pelo menos a meio caminho lá lidando com # comments
que ocupam toda a linha.
As coisas podem ficar um pouco confusas se você quiser lidar com comentários que seguem as linhas de dados da lista real, a menos que você tenha certeza de que suas linhas de dados não contêm caracteres #
embutidos.
Você pode usar substituição de processos e um script simples de ajuda.
Aqui estão alguns exemplos. O grc
antes de diff
gera saída colorida.
Eu usei funções bash, mas você pode, claro, salvá-las em um arquivo de script.
# 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:]]*#.*//; 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")
Aqui está a saída:
== 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
Tags rsync