在文档中xargs
提到了该-I
标志采用的“replstr”。当我发现要运行以下命令时,我开始阅读有关它的内容fswatch
:
fswatch -0 -e ".*" -i ".rb" . | xargs -0 -n 1 -I {} ruby {}
并开始阅读手册页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.
想想术语“replstr”似乎可能意味着“读取评估打印循环字符串”,这是它的缩写吗?我开始摆弄它,试图了解{}
正在做什么,但我不确定我是否真的明白了:
➜ 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
例如,echo {a..3}
对我来说确实没有意义。它看起来确实像是在做一些“在这里替换这个字符串列表”的事情,但我不确定这是否是正确的看待它的方式。另外,我不确定{}
replstr 是否是特定类型,以及是否有更多类型,或者 replstr 是否只是一对大括号之间的任何内容。希望获得有关 replstr 以及如何处理它们的一些指导。
答案1
replstr
意思是“替换字符串”或“替换字符串”。
原来的 replstr 是{}
.它首先是用find
命令exec
子句引入的,其中它被找到的每个文件名替换,例如
find /tmp -name "foo*" -exec echo file {} found \;
将显示,假设两个文件匹配该模式:
file foo1 found
file foo2 found
该xargs
命令允许对从传递到其标准输入的字符串构建的参数执行相同的操作,并且还允许指定与{}
替换字符串不同的内容。
请注意,默认的 replstr 只是{}
大括号内没有任何内容,后者用于不同的目的,例如您已经注意到的范围或参数扩展。
答案2
该-I
参数的工作方式如下:-I whatever
意味着字面上出现的whatever
被命令参数替换。演示:
$ echo "a
b
c" | xargs -I f echo hey f hey f
hey a hey a
hey b hey b
hey c hey c
看?xargs
取出每一行a
、b
、 和c
,并将它们替换为f
in echo hey f hey f
。
没有{}
涉及。
该-I
选项是 POSIX。 GNUxargs
记录了一个已弃用的-i
选项,如果调用该选项,其-iwhatever
行为类似于-I whatever
.如果直接调用-i
它的行为就像-I {}
.在这种情况下,出现的{}
被替换。{}
显然受到以下特征的启发find
:其-exec
谓词。
{a..b}
而Bash语法则foo{a,b,c}bar
通过其“大括号扩展”进行处理。{}
没有特殊含义,按原样传递给命令。 (如果不是,它将破坏符合标准的、常见的find
调用。)
答案3
是{...}
shell 的大括号展开,支持列表{a,b,c}
(扩展为a
、b
和c
)和数字序列{0..13}
(扩展为数字0
、1
... 12
、13
)或字符{a..d}
(a
、b
、c
、 )。(括号扩展与使用的占位d
符无关)。{}
xargs
扩展为有点奇怪的序列{a..3}
由ASCII 字符表。由于a
不是数字,两者都被视为字符,并且扩展为字符代码数值中a
和之间的所有字符。3
碰巧a
出现在 后面3
,因此该序列是向下遍历大写字母和数字 9 到 3。
正如所见,在这样的范围内混合字母和数字并不是很有用,但{a..z}
或{A..Z}
可能有用,以及在正则表达式和 shell 全局中类似的[a-z]
and 。 [A-Z]
(也就是说,如果您可以忽略其余字母。)