为什么chmod -R + x * .sh没有工作?

时间:2015-10-07 05:04:39

标签: bash chmod

所以,“chmod -R + x * .sh”在bash中不起作用。可以找到替代方案here。我的问题是:为什么不起作用? chmod是否只是缺少这个功能,因为没有人愿意实现它,或者是否有更深层次的bash / gnulib哲学呢?

3 个答案:

答案 0 :(得分:3)

public static string FindNegative(int[] array) { string yes = null; foreach (var n in array) { if (n < 0) { yes += (Array.IndexOf(array, n) + ":" + n + ","); } //return yes; } return yes; } *未处理chmod;它是一个称为globbing的shell功能。 shell将*.sh扩展为当前目录中以.sh结尾的所有名称的列表,并将它们作为单独的参数传递给chmod。 shell不知道该命令有任何递归目录搜索方面,而chmod从不知道命令行中有*

答案 1 :(得分:3)

这是因为在bash中,通配符模式由shell扩展而不是由程序扩展。这与Windows不同,后者将模式传递给程序本身。让我们考虑一下这个示例的directoy结构:

curdir
|_ 1.sh
|_ 2.sh
|_ subdir
   |_ 3.sh
   |_ 4.sh

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

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

chmod +x **/*.sh # Note that -R is not required

zsh understands **模式表示对子目录的递归搜索。因此,在这种情况下的最终命令将是:

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

答案 2 :(得分:1)

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

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