“Espera por tudo, mas usbmodem particular” zsh regular expression

1

Eu estou escrevendo firmware para diferentes dispositivos que se comunicam entre si e ambos estão conectados ao meu mac por USB. Eu estou usando zsh . O primeiro é sempre em /dev/tty.usbmodem1 e para alguns mac-resons estúpidos todo próximo dispositivo estará em um número de modem aleatório. Digamos que o segundo seja em /dev/tty.usbmodem11 .
Estou usando o seguinte comando para fazer o upload do meu firmware:

tools/uploader.py --port='/dev/tty.usbmodem*' Images/image.file 

Se não encontrar nenhum dispositivo sob o usbmodem, ele irá aguardar que o primeiro apareça.

O que eu quero é fazer uma expressão regular para este --port= para retornar qualquer coisa mas /dev/tty.usbmodem1

para poder carregar o firmware no segundo dispositivo enquanto ainda estiver conectado ao primeiro (que está sempre em usbmodem1 ).
Eu estava tentando:

tools/uploader.py --port='/dev/tty.usbmodem* | egrep \"usbmodem1$\" -v' Images/image.file

Mas não está funcionando se eu conectar um dispositivo enquanto esse script estiver esperando por ele. (o script pode esperar pelo dispositivo usando o primeiro comando, como escrevi acima).

    
por arbulgazar 27.07.2015 / 11:09

1 resposta

2

No comentário você confirma que uma linha de comando como

tools/uploader.py --port=/dev/tty.usbmodem2 --port=/dev/tty.usbmodem3 Images/image.file

está funcionando. Para escrever uma resposta mais geral, eu a derreto para

echo foo --bar=file2 --bar=file3 ...

que todos podem testar com copy & colar. Então, eu tenho duas abordagens zshishish em mente.

  1. Use o esquema de construção fileN onde N é um número que começa em 2 até digamos 5. Então você pode usar a expansão de contraventamento:

    $ echo foo --bar=file{2..6}
    foo --bar=file2 --bar=file3 --bar=file4 --bar=file5 --bar=file6
    

    Isso não importa se fileN é realmente um arquivo ou se ele existe. É só um texto.

  2. Use o qualificador glob P , que adiciona uma sequência (delimitada por : ) ao resultado de um padrão de globbing ( file* ):

    $ echo foo file*(P:--bar:)
    foo --bar file1 --bar file2 --bar file3 --bar file4 --bar file5 --bar file7
    

    eu. e. o resultado depende de quais arquivos existem, no meu exemplo file1 to file5 e file7 .

    Mas, espere, você quer excluir file1 , então modifique o padrão glob para file(^1) , que é a abreviação de file(*^1) e deve ser lido como file* mas não (^) file1 :

    $ echo foo file(^1)(P:--bar:)
    foo --bar file2 --bar file3 --bar file4 --bar file5 --bar file7
    

    Ou use file<2-> , que corresponde a file2 em diante:

    $ echo foo file<2->(P:--bar:)
    foo --bar file2 --bar file3 --bar file4 --bar file5 --bar file7
    

    Esteja ciente de que esse qualificador glob insere um espaço após o prefixo. Isso pode ser um problema, mas eu queria incluir essa abordagem também, porque geralmente é muito útil.

por 28.07.2015 / 19:54

Tags