Chmod和-r + r


13

我尝试以错误的顺序调用命令chmod。chmod file.txt -r这出于某些原因起作用。chmod file.txt +r另一方面拒绝工作。为什么是这样?出于什么原因一个命令起作用,而另一个则不起作用?

Answers:


18

这是GNU chmod如何处理输入的古怪之处,并非可移植到所有POSIX兼容的chmod实现中。

请注意,POSIXchmod coomand-line语法要求模式优先,GNUchmod也是如此(选项也应该位于模式之前)。其他任何事情都是无证的实现怪癖。


现在,说明为什么它在此特定实现中发生:

手册中有提示

但是,通常情况下,“ chmod a-w file”是更可取的,并且chmod -w file(没有--)会抱怨它的行为是否不同于“ chmod a-w file”的行为。

简而言之,由解析的选项getopt以开头-。像中的一样ls -aa是一个选项。长形式ls --all具有all作为一个选项。rm -rf(相当于rm -r -f)同时具有rf选项。

其他所有内容都是非选项参数,技术上称为操作数。我喜欢称它们为位置参数,因为它们的含义取决于它们的相对位置。在中chmod,第一个位置参数是mode,第二个位置参数是文件名。

理想情况下,模式不应以开头-。如果是这样,则应该使用--强制将解析作为操作数而不是选项(即使用chmod a-w filechmod -- -w file代替chmod -w file。),POSIX 也建议这样做。


如果查看源代码,您会发现它使用getopt来解析命令行选项。在这里,对“不正确”模式进行了特殊处理,例如-w

    case 'r':
    case 'w':
    case 'x':
    case 'X':
    case 's':
    case 't':
    case 'u':
    case 'g':
    case 'o':
    case 'a':
    case ',':
    case '+':
    case '=':
    case '0': case '1': case '2': case '3':
    case '4': case '5': case '6': case '7':
      /* Support nonportable uses like "chmod -w", but diagnose
         surprises due to umask confusion.  Even though "--", "--r",
         etc., are valid modes, there is no "case '-'" here since
         getopt_long reserves leading "--" for long options.  */

以您的示例为例:

  • chmod a-r file.txt将是最可靠的调用。
  • chmod +r file.txt 之所以有效,是因为第一个参数在位置上被解释为模式。
  • chmod -r file.txt仍然有效,因为会-r被解释为短r选项和特殊情况。
  • chmod -- -r file.txt是正确且有效的,因为-r位置被解释为模式。这不同于情况下没有--因为---r不被解释为一个选项
  • chmod file.txt -r仍然有效,因为会-r被解释为短r选项和特殊情况。选项与位置无关。从技术上讲,这滥用了无证的怪癖。
  • chmod file.txt +r不起作用,因为+r是操作数,而不是选项。第一个操作数(file.txt)被解释为模式...,并且无法解析。

4
例如,如果您有一个名为的文件,a+rwx并且执行类似的操作chmod * +r,而该a+rwx文件恰巧在glob扩展中排在第一位,则可能会产生有趣的结果。
约尔格W¯¯米塔格

1
如果是“ rm *”,则文件名为“ -rf”。
Edheldil

@Edheldil是的,您是对的。这似乎是应该解决的问题(还有一个错误,就像输入没有正确清理一样。)
TestyTentacleLinux


@StevenPenny没关系。首先,链接的手册页是部分1,即,getopt 命令,而不是库例程第3节。其次,这是指optstring,即已接受选项的列表(在chmodoptstring中设置为"Rcfvr::w::x::X::s::t::u::g::o::a::,::+::=::")。链接的“扫描模式”部分与包含传递给程序的args 的参数数组 无关argv
鲍勃
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.