1

Я пишу прошивку для разных устройств, которые общаются друг с другом, и оба они подключены к моему Mac через USB. Я использую zsh . Первый всегда находится на /dev/tty.usbmodem1 и для некоторых глупых mac-resons каждое следующее устройство будет иметь случайный номер модема. Допустим, второй находится на /dev/tty.usbmodem11 .
Я использую следующую команду для загрузки моей прошивки:

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

Если он не найдет никаких устройств под usbmodem, он будет ждать появления первого.

Я хочу сделать регулярное выражение для этого --port= чтобы возвращать что-либо кроме /dev/tty.usbmodem1

чтобы иметь возможность загружать прошивку на второе устройство, оставаясь подключенным к первому устройству (которое всегда находится на usbmodem1).
Я пытался:

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

Но это не работает, если я подключаю устройство, пока этот скрипт его ждет. (скрипт может ожидать устройства, используя первую команду, как я писал выше).

1 ответ1

2

В комментарии вы подтверждаете, что командная строка вроде

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

работает. Чтобы написать более общий ответ, я оплавляю его до

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

который каждый может проверить с помощью копирования и вставки. Итак, я имею в виду два подхода zsh'ish.

  1. Используйте fileN схемы построения N, где N - число, начиная с 2 и до, скажем, 5. Тогда вы можете использовать расширение скобки:

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

    Это не волнует, является ли fileN фактически файлом или существует ли он. Это просто текст.

  2. Используйте Глоб квалификатор P который присоединяет строку (разделители , например , : в результате шаблона (строится по file*

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

    И. е. результат зависит от того, какие файлы существуют, в моем примере от file1 до file5 и file7 .

    Но подождите, вы хотите исключить file1 , поэтому измените шаблон glob на file(^1) который является сокращением для file(*^1) и должен читаться как file* но не (^) file1:

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

    Или используйте file<2-> , который соответствует file2 далее:

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

    Имейте в виду, что этот префикс квалификатора glob вставляет пробел. Это может быть проблемой, но я тоже хотел включить этот подход, потому что он обычно очень удобен.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .