Linux中命令选项的顺序重要吗?


14

例如,当我输入以下任一内容时:

gcc -O hello.c -c

要么

gcc hello.c -c -O

双方都没有抱怨。

命令选项的顺序重要吗?

Answers:


18

这取决于程序本身。操作系统不决定顺序是否重要。

GCC的选项集如此之大,以至于我不能与任何权威机构说您能否以任意顺序提供任何选项。您必须阅读该选项的文档。也就是说,一般的经验法则是,如果您有两个或多个相互排斥的选项(例如-O1 -O2针对不同的优化级别),则程序通常会采用较早的选项。同样,这不是Linux强制执行的。

一个简单的程序可以让您以任意顺序指定大多数选项ls。清单中的细节当前目录下的所有文件,可与做ls -lals -al或者ls -l -a。但是,ls -l1(即'el''one')的输出与ls -1l('one''l')相同。这些是互斥的选项,最后列出的是第一个给出的。

还有一个奇怪的程序,它在参数到达时将选项应用于参数。因此,例如,您可能有一个假设命令blah -a 1 2 -b 3,该命令-a适用于所有三个参数,但-b仅适用于3

同样,这取决于所讨论的单个程序。如果不确定,请阅读文档。


5

在某些情况下,即使在GCC中,命令行选项的顺序也很重要。如果要与静态库(.a)链接,则如果指定-llib1 -llib2并且其中有一个函数liblib2.a调用liblib1.a未带入程序的函数,则链接将失败,并带有未解析的符号。使用共享库,这不是问题。

通常,正如其他人所说,选项的顺序可能会有所不同,也可能没有影响。但是,以下两个命令的输出是不同的-因此cat更改输出的参数顺序:

cat /etc/passwd /etc/group
cat /etc/group  /etc/passwd

还要注意,在Linux上(尤其是Linux),GNU getopt()易于对命令行重新排序,以便所有选项(以减号开头)在其他任何参数之前得到处理-除非您使用双破折号--来标记命令行结束参数,或者除非您设置环境变量POSIXLY_CORRECT。


4

仅当您有两个互斥的选项时。否则,顺序无关紧要。

当然,这可能会根据程序的编写方式而有所不同,但应适用于所有常规* nix工具。


3

很难知道,正如其他人已经告诉过你的那样(或没有)。

一个好的经验法则是打开手册页,看一下第一个示例,并在将arg放入其中时使用该顺序。

因此,如果我们看一下cat命令(man cat):

SYNOPSIS
       cat [OPTION] [FILE]...

似乎只要所有选项都在文件args之前,就可以了。

如果我们看一下gcc野兽(man gcc):

SYNOPSIS
       gcc [-c|-S|-E] [-std=standard]
           [-g] [-pg] [-Olevel]
           [-Wwarn...] [-pedantic]
           [-Idir...] [-Ldir...]
           [-Dmacro[=defn]...] [-Umacro]
           [-foption...] [-mmachine-option...]
           [-o outfile] [@file] infile...

       Only the most useful options are listed here; see below for the remainder.  g++ accepts mostly
       the same options as gcc.

要理解为cat命令不是那么简单:)

但是,如果您想安全地使用它,则-c似乎在-O之前,然后infile(hello.c)似乎在最后。

gcc -c -O hello.c

但是,正如您已经知道的那样,既然其他人都在工作……这是非常安全的:)


链接像这样的标志-static-libstdc++呢?
罗伊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.