为什么这有效:
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}
由三个单独的单词{chmod
、http,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
请注意,即使您的大括号扩展有效,该命令也是无意义的。
只需要写两条命令,
chown http /dir/test1
chmod 700 /dir/test1
答案2
因为,正如手册页中提到的,bash 将对每个单词执行大括号扩展后将命令行分割成单词。
因此,该命令行将首先被拆分为{chown
,httpd,chmod
和700}
,然后,由于{chown
不是有效的大括号扩展模式,因此它将保持原样,并且 bash 将尝试运行具有该名称的命令。
这是手册页中的引用:
扩展是在命令行上进行的当它被分割成单词之后。执行了七种扩展:大括号扩展、波形符扩展、参数和变量扩展、命令替换、算术扩展、分词和路径名扩展。
请注意顺序,这与其他 shell 不同(在 中zsh
,算术扩展之后将执行大括号扩展,并且根本不会执行额外的分词)。
以下内容将1 2
在zsh
或ksh
、 和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 "$_"