bob*_*obo 16 linux ordering command-line
例如,当我输入:
gcc -O hello.c -c
Run Code Online (Sandbox Code Playgroud)
或者
gcc hello.c -c -O
Run Code Online (Sandbox Code Playgroud)
两人都没有抱怨。
命令选项的顺序重要吗?
小智 20
这取决于程序本身;操作系统并不决定顺序是否重要。
GCC 的选项集非常庞大,如果您可以按任意顺序提供任何选项,我无法以任何权威说;您必须阅读该选项的文档。也就是说,一般的经验法则是,如果您有两个或多个互斥的选项(例如-O1 -O2
不同级别的优化),程序通常会采用较晚的选项而不是较早的选项。同样,这不是由 linux 强制执行的。
一个可以让您以任何顺序指定大多数选项的简单程序是ls
. 可以使用ls -la
,ls -al
或完成列出当前目录中所有文件的详细信息ls -l -a
。但是, ls -l1(即 'el' 'one')不会给出与 ls -1l ('one' 'l') 相同的输出。这些是相互排斥的选项,最后列出的优先于第一个给出。
还有一个奇怪的程序,它在参数到达时将选项应用于参数。因此,例如,您可能有一个假设命令blah -a 1 2 -b 3
,其中-a
适用于所有三个参数,但-b
仅适用于3
.
同样,这取决于相关的单个程序。如果您不确定,请阅读文档。
在某些情况下,即使在 GCC 中,命令行选项的顺序也很重要。如果您使用静态库 (.a) 进行链接,那么如果您指定-llib1 -llib2
并且其中有一个函数liblib2.a
调用了liblib1.a
未带入程序的函数,则链接将失败并显示未解析的符号。使用共享库,这不是问题。
一般来说,正如其他人所说,选项的顺序可能会也可能不会有所不同。但是,以下两个命令的输出是不同的 - 因此cat
改变输出的参数顺序:
cat /etc/passwd /etc/group
cat /etc/group /etc/passwd
Run Code Online (Sandbox Code Playgroud)
另请注意,在 Linux(特别是)上,GNUgetopt()
倾向于重新排序命令行,以便在任何其他参数之前处理所有选项(以减号开头) - 除非您使用双破折号--
标记结束参数,或者除非您设置环境变量 POSIXLY_CORRECT。