Bash 为什么';t chmod-R+;x*.sh工作?

Bash 为什么';t chmod-R+;x*.sh工作?,bash,chmod,Bash,Chmod,因此,“chmod-R+x*.sh”在bash中不起作用。可以找到替代方案。我的问题是:为什么它不起作用?chmod只是因为没有人费心去实现它而缺少这个特性,还是有更深刻的bash/gnulib哲学呢?chmod不处理*;这是一个shell特性,称为。shell将*.sh展开为当前目录中以.sh结尾的所有名称的列表,并将它们作为单独的参数传递给chmod。shell不知道该命令有任何递归目录搜索方面,并且chmod从不知道命令行中有*。chmod不处理*;这是一个shell特性,称为。shell

因此,“chmod-R+x*.sh”在bash中不起作用。可以找到替代方案。我的问题是:为什么它不起作用?chmod只是因为没有人费心去实现它而缺少这个特性,还是有更深刻的bash/gnulib哲学呢?

chmod不处理
*
;这是一个shell特性,称为。shell将
*.sh
展开为当前目录中以
.sh
结尾的所有名称的列表,并将它们作为单独的参数传递给
chmod
。shell不知道该命令有任何递归目录搜索方面,并且
chmod
从不知道命令行中有
*

chmod不处理
*
;这是一个shell特性,称为。shell将
*.sh
展开为当前目录中以
.sh
结尾的所有名称的列表,并将它们作为单独的参数传递给
chmod
。shell不知道该命令有任何递归目录搜索方面,并且
chmod
从不知道命令行中有一个
*

当您运行该命令时,它首先由shell预处理,然后执行。在预处理阶段,星号
*
将展开为匹配项(在本例中为当前目录中的shell文件)。然后,
-R
被忽略,因为没有可以递归的输入目录


chmod
并不缺少此功能。它甚至无法获得您最初在命令中使用的星号信息。

当您运行命令时,它首先由shell预处理,然后执行。在预处理阶段,星号
*
将展开为匹配项(在本例中为当前目录中的shell文件)。然后,
-R
被忽略,因为没有可以递归的输入目录


chmod
并不缺少此功能。它甚至无法获取命令中最初包含的星号信息。

这是因为在
bash
中,通配符模式由shell扩展,而不是由程序扩展。这与Windows中的模式传递给程序本身不同。让我们考虑这个样本指导结构:

curdir
|_ 1.sh
|_ 2.sh
|_ subdir
   |_ 3.sh
   |_ 4.sh
假设您正在
curdir
目录中运行命令
chmod-R+x*.sh
。shell看到
*.sh
是一个通配符模式,并将其扩展为
1.sh2.sh
,因为这些文件名与该模式匹配。执行的最后一个命令变成
chmod-R+x1.sh2.sh
。如您所见,所有参数都不是目录,因此
-R
开关无效

有些shell支持更复杂的模式。例如,如果正在使用
zsh
,则可以运行以下命令:

chmod +x **/*.sh # Note that -R is not required
zsh
模式表示对子目录的递归搜索。因此,这种情况下的最终命令是:

chmod +x 1.sh 2.sh subdir/3.sh subdir/4.sh

这是因为在
bash
中,通配符模式由shell扩展,而不是由程序扩展。这与Windows中的模式传递给程序本身不同。让我们考虑这个样本指导结构:

curdir
|_ 1.sh
|_ 2.sh
|_ subdir
   |_ 3.sh
   |_ 4.sh
假设您正在
curdir
目录中运行命令
chmod-R+x*.sh
。shell看到
*.sh
是一个通配符模式,并将其扩展为
1.sh2.sh
,因为这些文件名与该模式匹配。执行的最后一个命令变成
chmod-R+x1.sh2.sh
。如您所见,所有参数都不是目录,因此
-R
开关无效

有些shell支持更复杂的模式。例如,如果正在使用
zsh
,则可以运行以下命令:

chmod +x **/*.sh # Note that -R is not required
zsh
模式表示对子目录的递归搜索。因此,这种情况下的最终命令是:

chmod +x 1.sh 2.sh subdir/3.sh subdir/4.sh

我想你想要的是
find-名称'*.sh'-exec chmod+x{}+
使用
find
-exec
代替为什么您认为它“不起作用”?它在名称以“.sh”结尾的所有文件和名称以“.sh”结尾的子目录中的所有文件上设置可执行位。很好用。我想你想要的是
find-名称'*.sh'-exec chmod+x{}+
使用
find
-exec
代替为什么您认为它“不起作用”?它在名称以“.sh”结尾的所有文件和名称以“.sh”结尾的子目录中的所有文件上设置可执行位。很好用。