为什么 bash 大括号扩展不适用于命令?

sys*_*yss 8 bash brace-expansion

为什么这是有效的:

mkdir /dir/test{1,2,3}
Run Code Online (Sandbox Code Playgroud)

这不是吗?

{chown httpd,chmod 700} /dir/test1
-bash: {chown: command not found
Run Code Online (Sandbox Code Playgroud)

我的 Bash 版本是:GNU bash,版本 4.2.46(2)-release

Kus*_*nda 11

您的大括号扩展无效。大括号扩展必须是shell 中的一个

单词是由不带引号的空格(或制表符或换行符,默认情况下){chown httpd,chmod 700}分隔的字符串,该字符串由三个单独的单词组成{chmodhttp,chmod并且700}不会被识别为大括号扩展。

相反,shell 会将该行解释为{chown命令,并使用参数http,chmod,700}和执行/dir/test1

测试这个最简单的方法是echo

$ echo {chown httpd,chmod 700} /dir/test1
{chown httpd,chmod 700} /dir/test1

$ echo {"chown httpd","chmod 700"} /dir/test1
chown httpd chmod 700 /dir/test1
Run Code Online (Sandbox Code Playgroud)

请注意,即使您的大括号扩展有效,该命令也是无意义的。

只写两个命令,

chown http /dir/test1
chmod 700  /dir/test1
Run Code Online (Sandbox Code Playgroud)

  • @Time4Tea 事实上,一个命令带有错误的参数。 (3认同)

mos*_*svy 6

因为,如手册页中所述,bash 将将命令行拆分为单词对每个单词执行大括号扩展。

因此,该命令行将首先拆分为{chown,httpd,chmod700}, 然后,由于{chown不是有效的大括号扩展模式,它将保持原样,bash 将尝试运行具有该名称的命令。

这是手册页中的引用:

其拆分为单词后在命令行上进行扩展。执行的扩展有七种:大括号扩展、波浪号扩展、参数和变量扩展、命令替换、算术扩展、分词和路径名扩展。

注意顺序,与其他shell不同(在 中zsh,大括号扩展会在算术扩展后进行,完全不会进行额外的分词)。

以下内容将1 2zsh或 中打印ksh,并x ybash

f=; f1=x; f2=y; echo $f{1,2}
Run Code Online (Sandbox Code Playgroud)