我正在学习一本关于Shell (Bash)脚本的入门书,有以下疑问:
我遇到了
ls
命令
ls
的man
页面列出了一些用法:
ls -a
ls --block-size='M'
我的问题:
- -和--有什么区别?
- 为什么会有两种命名方式?
- 背后的动机是什么?
长格式选项(--foo
)是GNU扩展,这是GNU ls
中存在的内容,但在符合UNIX工具设置要求的POSIX标准中根本不存在,因此其他版本的ls
无需支持这些选项。在这种情况下,整个单词(foo
)都具有意义。这种命名法是最近添加的,比短格式更具表达力(并且没有名称空间限制)。
短格式选项(-al
)在形式上至少是标准化的(尽管扩展可以添加新选项)。它们逐个字符处理,即一个字母一个字母地处理 - 因此,-al
表示 -a
(显示隐藏文件)和 -l
(长输出),而不是在这种情况下具有自己的含义的 -al
。这是UNIX命令行选项的原始语法,因此不仅由于简洁性而得到支持,而且还具有向后兼容性。
find
命令的选项,它们似乎不遵循该模式。例如,“find -iname”不是“find -i -n -a -m -e”...单词“iname”是其自己独特的选项。我想find
命令是一个例外?(在OSX上工作) - Manninghamfind
实际上确实符合POSIX语法指南,因为在POSIX标准版本的find
中,至少需要一个目录名称--您必须使用find . -iname
,而不仅仅是find -iname
--并且根据POSIX实用程序语法指南(但与GNU的更宽松的实现不同),第一个参数之后的所有内容也都是位置参数,而不是选项。因此,所有的find
操作和过滤器---iname
,-print
等--都被指定为位置参数,而不是选项(这是有道理的,因为它们是有顺序的)。 - Charles Duffyls
在内)具有约束力。 - Charles Duffy
ls
是一个外部命令; 无论哪个程序调用它,它的行为都是完全相同的,无论该程序是否是shell。 - Charles Duffy