bash – 如何判断哪些命令将使用大括号扩展,哪些命令不会?

例如,这有效:

$curl -s -X获取“http://api-int.abc.com/api/{,,,}ukulele/v1/health”

这运行4个curl命令,这是我想要的.

同时ping不会使用大括号扩展:

$ping {google,yahoo,microsoft}.com
usage: ping [-AaDdfnoQqRrv] [-b boundif] [-c count] [-G sweepmaxsize]

但触摸会:

$touch .temp / {a,b,c} .txt

创建三个文件.

我如何从手册页中了解这些命令哪些可以使用大括号扩展?

最佳答案
首先要理解的是,某些命令允许多个参数,而某些命令则不允许.虽然touch允许多个参数,但ping不允许.在ping的情况下,大括号扩展为多个并使用多个参数调用ping,而ping不会这样做.在这种情况下,for循环是更好的解决方案.另外,卷曲中的括号是一种特殊情况(见下文).

“哪些命令可以使用大括号扩展”的答案是全部而且没有.在将扩展输出传递给命令之前,括号扩展由shell完成.换句话说,正在启动的命令完全不相关. foo {bar,baz}扩展到foobar foobaz是在启动命令并将扩展字符串作为参数传递给它之前由shell完成的.

但是,括号扩展不会出现在引号内.换句话说,“{,,,}”和“{a,b,c}”都保留为字符串,不会展开:

$echo "{,,,}"
{,,,}
$echo "{a,b,c}"
{a,b,c}

要使扩展工作,您应该删除引号:

$echo {,,,}  ## this expands to a blank string, so this is what is printed

$echo {a,b,c}
a b c

这在man bash(强调我的)的相关部分中有记录:

Brace expansion is performed before any other expansions, and any characters special to other expansions are preserved in the result. It is strictly textual. Bash does not apply any syntactic interpretation to the context of the expansion or the text between the braces.

A correctly-formed brace expansion must contain unquoted opening and closing braces, and at least one unquoted comma or a valid sequence expression.

现在,您感到困惑的原因是curl实际上有自己的解析器,并且还处理大括号扩展.这是独立于shell完成的,并在man curl中进行了解释:

You can specify multiple URLs or parts of URLs by writing part
sets within braces as in:

06002

因此,任何命令都可以使用大括号扩展,因为它实际上不是使用它的命令,而是在调用命令之前扩展大括号中的表达式的shell. Curl令人困惑,因为它有自己的类似功能.

转载注明原文:bash – 如何判断哪些命令将使用大括号扩展,哪些命令不会? - 代码日志