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 语句必须运行多次-l
。ls
需要更长的时间才能完成多个-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=never
orls --color=auto
或 的命令将是错误的rm -i
。
因此,这些命令旨在让后面的标志覆盖前面的标志。