hel*_*hod 18 bash coding-style
似乎大多数(很多)命令都实现了这样的选项参数:
如果短选项需要选项参数,则该选项由选项参数的空格分隔,例如
$ head -n 10
Run Code Online (Sandbox Code Playgroud)如果long选项需要一个option参数,则该选项由=option参数分隔,例如
$ head --lines=10
Run Code Online (Sandbox Code Playgroud)这是某种惯例吗?是的,我在哪里可以找到它?除此之外,原因是什么?
为什么例如不是
$ head --lines 10
Run Code Online (Sandbox Code Playgroud)
?
Jon*_*ler 28
POSIX 实用程序约定中记录了短选项的基本原理.大多数选项解析器允许将值"附加"到字母(-n10),主要是因为广泛的历史先例.
GNU在其编码标准和手册页中指定了长选项的基本原理getopt_long().
很久以前,在很久以前的StackOverflow中,有一个关于命令选项样式的问题.也许不是一个好问题,但我认为答案得到了解决(但我承认有偏见).无论如何,它已被删除,所以我将在这里复苏我的答案,因为(a)重新发现答案是一个痛苦的过程,(b)它有与选项有关的有用信息.
您认识到多少种不同类型的选项?我能想到很多,包括:
有时必须附加采用可选参数的选项,有时必须遵循"="符号.POSIX不支持有意义的可选参数(POSIX getopt()只允许它们用于命令行的最后一个选项).
所有敏感期权系统都使用由双击(' --')组成的选项来表示"期权结束" - 以下参数是"非选项参数"(通常是文件名),即使它们以短划线开头.(我认为支持这种表示法是必要的.)请注意,如果你有一个cmd带有一个-f期望参数的选项的命令,那么如果你用它--来代替参数调用它(cmd -f -- -other许多版本的getopt()将把它--作为文件名作为-f然后解析-other为常规选项.也就是说,--如果必须将选项解释为另一个选项的参数,则不会终止选项.
许多但不是所有程序都接受单个破折号作为文件名来表示标准输入(通常)或标准输出(偶尔).有时,与GNU' tar'一样,两者都可以在一个命令行中使用:
tar -cf - -F - | ...
Run Code Online (Sandbox Code Playgroud)
第一个独奏短跑意味着'写入stdout'; 第二个意思是"从stdin读取文件名".
有些程序使用其他约定 - 也就是说,选项前面没有破折号.其中许多都来自Unix最古老的日子.例如,'tar'和'ar'都接受没有破折号的选项,因此:
tar cvzf /tmp/somefile.tgz some/directory
Run Code Online (Sandbox Code Playgroud)
该dd命令仅使用opt=value:
dd if=/some/file of=/another/file bs=16k count=200
Run Code Online (Sandbox Code Playgroud)
有些程序允许您完全交错选项和其他参数; 例如,C编译器,make和在环境中没有POSIXLY_CORRECT运行的GNU实用程序.许多程序希望选项先于其他参数.
现代程序git越来越像似乎使用基本命令名(git)后跟子命令(commit)后跟options(-m "Commit message").这是由sccsSCCS命令的接口预先设定的,然后由cvs它使用,并且也被使用svn(它们都是版本控制系统).但是,其他大型命令套件在适当时采用相似的样式.
我不同系统之间没有强烈的偏好.当选项足够少时,带有助记符值的单个字母很方便.GNU支持这一点,但建议使用双字母表后面的多字母选项进行备份.
有些事我反对.其中一个最差的是使用不同含义的相同选项字母,具体取决于其前面的其他选项字母.在我的书中,这是禁忌,但我知道软件在哪里完成.
另一个令人反感的行为是处理参数的风格不一致(特别是对于单个程序,但也在一套程序中).要么附加参数要么需要分离参数(或允许其中任何一个),但是没有一些选项需要附加参数,而其他参数需要分离参数.并且是否=可以用来分离选项和论证.
与许多(与软件相关的)事物一样 - 一致性比个人决策更重要.
无论你做什么,请阅读TAOUP的命令行选项并考虑命令行界面的标准.(由JF Sebastian补充- 谢谢;我同意.)