我很好奇 -ls -l
和之间有区别ls -lllllllllllllllllllllllllllll
吗?
输出似乎相同,我对为什么ls
允许重复开关感到困惑。这是大多数命令中的标准做法吗?
R..*_*ICE 21
因为这是正确的做法。假设您有一个脚本执行以下操作:
ls $LS_OPTIONS -l "$dir"
Run Code Online (Sandbox Code Playgroud)
可能$LS_OPTIONS
已经包含-l
. 此命令产生错误将是违反直觉和烦人的,并且需要脚本中的额外逻辑来避免它。
-l
可能不是最好的例子,但希望你能看到这个概念一般是如何应用的。一个更好的例子是编译器选项,$CFLAGS
它可能会在编译器的特定调用中复制显式选项。
cha*_*aos 17
简短的回答:
因为它被编程为忽略标志的多次使用。
长答案:
正如您在 的源代码中看到的那样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 }
Run Code Online (Sandbox Code Playgroud)
该函数getopt_long()
读取提供给程序的所有参数。如果设置-l
了变量format
。因此,当您键入 multiple 时-lllllllll
,该变量会设置多次,但这不会改变任何内容。
嗯,它改变了一件事。由于多个-l
标志,这个巨大的 switch case 语句必须运行多次。ls
需要更长的时间来完成多个-l
标志。但这一次不值一提。=)
che*_*ner 11
ls
不是bash
命令,而是您碰巧从bash
. 也就是说,-l
它只是一种布尔标志,如果存在,它会导致ls
对输出使用长样式格式。大多数程序将简单地忽略此类标志的多次使用(ls -ll
与 相同ls -l -l
),尽管有一些例外(例如,如果-v
表示“详细”,则程序可能会将多次使用解释为“更详细”)。
如果像ls
这样的命令不允许重复选项,Shell 别名会很烦人。
假设你有
alias ls='ls --color=auto'
alias rm='rm -i'
Run Code Online (Sandbox Code Playgroud)
然后,如果不允许出现冲突标志,则发出类似ls --color=never
orls --color=auto
或 or 的命令将是错误的rm -i
。
因此,这些命令旨在让后面的标志覆盖前面的标志。