像 {} 这样的 replstr 是什么?

像 {} 这样的 replstr 是什么?

在文档中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取出每一行ab、 和c,并将它们替换为fin 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}(扩展为abc)和数字序列{0..13}(扩展为数字01... 1213)或字符{a..d}abc、 )。(括号扩展与使用的占位d符无关)。{}xargs

扩展为有点奇怪的序列{a..3}ASCII 字符表。由于a不是数字,两者都被视为字符,并且扩展为字符代码数值中a和之间的所有字符。3碰巧a出现在 后面3,因此该序列是向下遍历大写字母和数字 9 到 3。

正如所见,在这样的范围内混合字母和数字并不是很有用,但{a..z}{A..Z}可能有用,以及在正则表达式和 shell 全局中类似的[a-z]and 。 [A-Z](也就是说,如果您可以忽略其余字母。)

相关内容