BASH:'-'和'--'选项的区别

11

我正在学习一本关于Shell (Bash)脚本的入门书,有以下疑问:

  • 我遇到了ls命令

  • lsman页面列出了一些用法:

    ls -a
    ls --block-size='M'

我的问题:

  • -和--有什么区别?
  • 为什么会有两种命名方式?
  • 背后的动机是什么?

5
虽然不完全相关,但很接近。http://superuser.com/questions/372203/whats-the-difference-between-one-dash-and-two-dashes-for-command-prompt-paramet意思:这是一个超级用户网站上的问题,询问命令提示符参数中一个短横线和两个短横线的区别。 - Suvarna Pattayil
2
这根本不是一个bash问题 -- ls是一个外部命令; 无论哪个程序调用它,它的行为都是完全相同的,无论该程序是否是shell。 - Charles Duffy
抱歉 @CharlesDuffy,我不知道 ls 是一个外部命令 - 我是新手 :) - pranav
2个回答

14

长格式选项(--foo)是GNU扩展,这是GNU ls中存在的内容,但在符合UNIX工具设置要求的POSIX标准中根本不存在,因此其他版本的ls无需支持这些选项。在这种情况下,整个单词(foo)都具有意义。这种命名法是最近添加的,比短格式更具表达力(并且没有名称空间限制)。

短格式选项(-al)在形式上至少是标准化的(尽管扩展可以添加新选项)。它们逐个字符处理,即一个字母一个字母地处理 - 因此,-al 表示 -a(显示隐藏文件)和 -l(长输出),而不是在这种情况下具有自己的含义的 -al。这是UNIX命令行选项的原始语法,因此不仅由于简洁性而得到支持,而且还具有向后兼容性。


请问您能否稍微详细地解释一下?我还无法真正理解您的意思 ;) - pranav
1
http://mywiki.wooledge.org/BashGuide(以及同一维基上的其他内容——陷阱页面和常见问题解答尤其有用)是一个很好的起点。 - Charles Duffy
非常感谢 @CharlesDuffy :) - pranav
@CharlesDuffy,您的回答是我理解的...但现在我正在寻找find命令的选项,它们似乎不遵循该模式。例如,“find -iname”不是“find -i -n -a -m -e”...单词“iname”是其自己独特的选项。我想find命令是一个例外?(在OSX上工作) - Manningham
2
@Manningham,find实际上确实符合POSIX语法指南,因为在POSIX标准版本的find中,至少需要一个目录名称--您必须使用find . -iname,而不仅仅是find -iname--并且根据POSIX实用程序语法指南(但与GNU的更宽松的实现不同),第一个参数之后的所有内容也都是位置参数,而不是选项。因此,所有的find操作和过滤器---iname-print等--都被指定为位置参数,而不是选项(这是有道理的,因为它们是有顺序的)。 - Charles Duffy
显示剩余3条评论

2
他们都完成了相同的任务:将参数传递给被调用的程序。没有太多的方法可以做到这一点,也没有标准的方法:这两种主要的方式被称为短选项和长选项(GNU风格)。一个程序不需要同时实现它们,尽管通常的做法是将它们作为唯一处理。

严格来说,有一种标准的方式(在“经过标准机构认可和发布”的意义上),尽管它只对符合 POSIX 标准的实用程序(包括 ls 在内)具有约束力。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接