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

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

例如,当我输入:

gcc -O hello.c -c

或者

gcc hello.c -c -O

两人都没有什么抱怨。

命令选项的顺序重要吗?

答案1

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

GCC 的选项集非常庞大,我无法保证你能提供任何选项的顺序是任意的;您必须阅读该选项的文档。也就是说,一般的经验法则是,如果您有两个或多个互斥的选项(例如,-O1 -O2针对不同的优化级别),程序通常会选择较晚的选项而不是较早的选项。同样,这不是 Linux 强制执行的。

一个允许您以任意顺序指定大多数选项的简单程序是。使用或ls可以详细列出当前目录中的所有文件。但是,ls -l1(即 'el' 'one')不会给出与 ls -1l('one' 'l')相同的输出。这些是互斥的选项,最后列出的选项将覆盖第一个给出的选项。ls -lals -alls -l -a

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

再次强调,这取决于具体程序。如果您不确定,请阅读文档。

答案2

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

一般来说,正如其他人所说,选项的顺序可能会或可能不会产生影响。但是,下面两个命令的输出不同 - 因此参数的顺序会cat改变输出:

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

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

答案3

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

当然,这可能因程序的编写方式而异,但应该适用于所有正常的 *nix 工具。

答案4

很难知道,因为其他人已经告诉你它可能会有所不同(或不会)。

一个好的经验法则是打开手册页并查看第一个示例,并在其中输入参数时使用该顺序。

所以如果我们看一下 cat 命令(man cat):

SYNOPSIS
       cat [OPTION] [FILE]...

看起来只要所有选项都在文件参数之前就没问题了。

如果我们看一下 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

但正如您所知,由于其他人都在工作......这是非常安全的:)

相关内容