所以,“chmod -R + x * .sh”在bash中不起作用。可以找到替代方案here。我的问题是:为什么不起作用? chmod是否只是缺少这个功能,因为没有人愿意实现它,或者是否有更深层次的bash / gnulib哲学呢?
答案 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
并不缺少此功能。它甚至无法获得您在命令中最初为星形符号的信息。