O que são replstrs como {}?

0

Na documentação de xargs há menção de um "replstr" que o -I flag assume. Comecei a ler sobre isso quando encontrei este comando para executar fswatch :

fswatch -0 -e ".*" -i ".rb" . | xargs -0 -n 1 -I {} ruby {}

e comecei a ler a página de manual para xargs

-I replstr
        Execute utility for each input line, replacing one or more occurrences of replstr in up to replacements (or 5 if no -R flag is
        specified) arguments to utility with the entire line of input.  The resulting arguments, after replacement is done, will not be
        allowed to grow beyond 255 bytes; this is implemented by concatenating as much of the argument containing replstr as possible, to
        the constructed arguments to utility, up to 255 bytes.  The 255 byte limit does not apply to arguments to utility which do not
        contain replstr, and furthermore, no replacement will be done on utility itself.  Implies -x. 

Pensar sobre o termo "replstr" parece que provavelmente significa algo como "read evaluate print loop string", é para isso que é curto? Comecei a brincar com ele para tentar ter uma ideia do que o {} está fazendo, mas não tenho certeza se realmente entendi:

➜  scripts git:(master) ✗  {0..3}
zsh: command not found: 0..3
➜  scripts git:(master) ✗ echo {0..3}
0 1 2 3
➜  scripts git:(master) ✗ echo {a..3}
a ' _ ^ ] \ [ Z Y X W V U T S R Q P O N M L K J I H G F E D C B A @ ? > = < ; : 9 8 7 6 5 4 3
➜  scripts git:(master) ✗ echo {a..d}
a b c d
➜  scripts git:(master) ✗ echo cats and dogs | xargs
cats and dogs
➜  scripts git:(master) ✗ echo cats and dogs | xargs {}
xargs: {}: No such file or directory
➜  scripts git:(master) ✗ echo cats and dogs | xargs {} echo {}
xargs: {}: No such file or directory
➜  scripts git:(master) ✗ echo cats and dogs | xargs -I {}

➜  scripts git:(master) ✗ echo cats and dogs | xargs -I {} echo {}
cats and dogs

Por exemplo, echo {a..3} não faz sentido para mim. Definitivamente, parece que está fazendo algo com o efeito de "substituir esta lista de strings aqui", mas não tenho certeza se esse é o jeito certo de ver isso. Também não tenho certeza se {} é um tipo específico de replstr e se há mais ou se um replstr é qualquer coisa entre um par de chaves. Adoraria alguma orientação sobre o replstr e como abordá-los.

    
por mbigras 23.10.2016 / 03:01

3 respostas

1

O argumento -I funciona assim: -I whatever significa que ocorrências literalmente de whatever são substituídas pelo argumento de comando. Demonstração:

$ echo "a
b
c" | xargs -I f echo hey f hey f
hey a hey a
hey b hey b
hey c hey c

Veja? xargs pegou cada uma das linhas a , b e c e as substituiu no lugar de f em echo hey f hey f .

Não há {} envolvido.

A opção -I é POSIX. O GNU xargs documenta uma opção -i preterida que, se chamada como -iwhatever , se comporta como -I whatever . Se invocado como apenas -i , ele se comportará como -I {} . Nesse caso, ocorrências de {} são substituídas. {} é claramente inspirado por um recurso do find : its -exec predicado.

A sintaxe {a..b} e foo{a,b,c}bar Bash processada por sua "expansão de contraventamento". {} não tem significado especial e é passado para um comando como está. (Se não fosse, ele quebraria as invocações find de conformidade padrão, comumente.)

    
por 23.10.2016 / 03:40
2

replstr significa "string de substituição" ou "replace string".

A replicação original é {} . Ele foi introduzido pela primeira vez com a cláusula find command exec , onde foi substituído por cada nome de arquivo encontrado, por exemplo,

find /tmp -name "foo*" -exec echo file {} found \;

será exibido, assumindo que dois arquivos correspondam ao padrão:

file foo1 found
file foo2 found 

O comando xargs permite fazer o mesmo com argumentos construídos a partir de strings passadas para sua entrada padrão, e também permite especificar algo diferente de {} como string de substituição.

Observe que a replicação padrão é apenas {} sem nada entre as chaves, sendo a última usada para finalidades diferentes, por exemplo, varia conforme você já notou ou expansão de parâmetros.

    
por 23.10.2016 / 03:46
1

A {...} é a expansão da cinta do shell , que suporta listas como {a,b,c} (expande para a , b e c ) e sequências de números como {0..13} (expande para os números 0 , 1 ... 12 , 13 ) ou caracteres {a..d} ( a , b , c , d ). (A expansão do recurso não tem nada a ver com o espaço reservado {} usado por xargs ).

A seqüência um tanto estranha que {a..3} expande é explicada pela tabela de caracteres ASCII . Como a não é um número, ambos são considerados caracteres e a expansão é composta por todos os caracteres entre a e 3 pelo valor numérico dos códigos de caracteres. Por acaso, a vem depois de 3 , então a sequência não passa pelas letras maiúsculas e os números 9 a 3.

Como visto, misturar letras e números em um intervalo como esse não é muito útil, mas {a..z} ou {A..Z} pode ser, assim como [a-z] e [A-Z] em regexes e shell globs semelhantes. (Isto é, se você pode ignorar o resto das letras.)

    
por 23.10.2016 / 11:36