为什么 bash 大括号扩展对命令不起作用?

为什么 bash 大括号扩展对命令不起作用?

为什么这有效:

mkdir /dir/test{1,2,3}

这不是吗?

{chown httpd,chmod 700} /dir/test1
-bash: {chown: command not found

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

答案1

您的大括号扩展无效。大括号扩展必须是一个单词在壳里。

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

相反,shell 会将该行解释为{chown命令,并使用参数http,chmod700}和执行/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

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

只需要写两条命令,

chown http /dir/test1
chmod 700  /dir/test1

答案2

因为,正如手册页中提到的,bash 将对每个单词执行大括号扩展将命令行分割成单词。

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

这是手册页中的引用:

扩展是在命令行上进行的当它被分割成单词之后。执行了七种扩展:大括号扩展、波形符扩展、参数和变量扩展、命令替换、算术扩展、分词和路径名扩展。

请注意顺序,这与其他 shell 不同(在 中zsh,算术扩展之后将执行大括号扩展,并且根本不会执行额外的分词)。

以下内容将1 2zshksh、 和x y中打印bash

f=; f1=x; f2=y; echo $f{1,2}

答案3

其他答案已经解释了为什么大括号扩展不起作用。暂时忽略这个问题,您可能想避免重复文件名,并且还有其他方法可以做到这一点。将文件名分配给变量,或使用$_特殊变量(它包含上一个命令的最后一个 shell 字):

f="some long and ugly filename"
chown httpd "$f"
chmod 700 "$f"

或者

chown httpd "some long and ugly filename"
chmod 700 "$_"

相关内容