Comentários nas listas de argumentos?

3

Alguns comandos, como rsync , aceitam listas como argumento. Esses arquivos podem conter comentários unix como # ?

    
por ThomasReggi 13.10.2011 / 09:10

4 respostas

6

A menos que a documentação do comando mencione explicitamente que pode conter comentários, suponha que não seja possível.

    
por 13.10.2011 / 09:14
3

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[@]}";
    
por 13.10.2011 / 20:22
0

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"
    
por 13.10.2011 / 12:18
0

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
    
por 14.10.2011 / 10:19

Tags