我正在为相互通信的不同设备编写固件,它们都通过 USB 连接到我的 Mac。我正在使用zsh
。第一个始终处于打开状态/dev/tty.usbmodem1
,出于某些愚蠢的 Mac 原因,每个下一个设备都将使用随机调制解调器号码。假设第二个处于打开状态/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
在评论中你确认命令行如下
tools/uploader.py --port=/dev/tty.usbmodem2 --port=/dev/tty.usbmodem3 Images/image.file
正在工作。为了写一个更通用的答案,我将其融化为
echo foo --bar=file2 --bar=file3 ...
每个人都可以通过复制和粘贴进行测试。所以,我想到了两种 zsh'ish 方法。
使用构造方案
fileN
,其中N
的数字从 2 开始直到 5。然后您可以使用括号扩展:$ echo foo --bar=file{2..6} foo --bar=file2 --bar=file3 --bar=file4 --bar=file5 --bar=file6
这不关心它是否
fileN
实际上是一个文件或者是否存在。它只是一个文本。使用 glob 限定符
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 限定符会在前缀后插入一个空格。这可能是一个问题,但我也想包含这种方法,因为它通常非常方便。