为什么 ls 接受重复的开关?

为什么 ls 接受重复的开关?

ls -l我很好奇 -和之间有区别吗ls -lllllllllllllllllllllllllllll

输出似乎是相同的,我对为什么ls允许重复的开关感到困惑。这是大多数命令中的标准做法吗?

答案1

因为这是正确的做法。假设您有一个脚本执行以下操作:

ls $LS_OPTIONS -l "$dir"

其中可能$LS_OPTIONS已经包含-l.该命令产生错误是违反直觉且令人烦恼的,并且需要在脚本中添加额外的逻辑来避免它。

-l可能不是最好的例子,但希望您能了解这个概念的一般应用方式。一个更好的例子是编译器选项,因为$CFLAGS它可能会在编译器的特定调用中重复显式选项。

答案2

简短回答:

因为它被编程为忽略标志的多次使用。

长答案:

正如你在源代码其中ls,有一个带有功能的部分getopt_long()和一个巨大的开关盒:

1648       int c = getopt_long (argc, argv,
1649                            "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UXZ1",
1650                            long_options, &oi);
      ....
1654       switch (c)
1655         {
      ....
1707         case 'l':
1708           format = long_format;
1709           break;
      ....
1964     }

该函数getopt_long()读取提供给程序的所有参数。如果设置了-l变量。format因此,当您键入 multiple 时,-lllllllll该变量会被设置多次,但这不会改变任何内容。

嗯,它改变了一件事。由于有多个标志,这个巨大的 switch case 语句必须运行多次-lls需要更长的时间才能完成多个-l标志。但这一次不值一提。 =)

答案3

ls不是bash命令,而是您碰巧从中启动的单独的可执行文件bash。也就是说,-l它只是一种布尔标志,如果存在,则会导致ls使用长样式格式进行输出。大多数程序将简单地忽略此类标志的多次使用(ls -ll与 相同ls -l -l),但也有一些例外(例如,如果-v表示“详细”,则程序可能会将多次使用解释为“更加详细”)。

答案4

ls如果像这样的命令不允许重复选项,那么 Shell 别名会非常烦人。

假设你有

alias ls='ls --color=auto'
alias rm='rm -i'

然后,如果不允许冲突的标志,则发出类似ls --color=neverorls --color=auto或 的命令将是错误的rm -i

因此,这些命令旨在让后面的标志覆盖前面的标志。

相关内容