![Linux 中命令选项的顺序重要吗?](https://linux22.com/image/1230154/Linux%20%E4%B8%AD%E5%91%BD%E4%BB%A4%E9%80%89%E9%A1%B9%E7%9A%84%E9%A1%BA%E5%BA%8F%E9%87%8D%E8%A6%81%E5%90%97%EF%BC%9F.png)
例如,当我输入:
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 -la
ls -al
ls -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
但正如您所知,由于其他人都在工作......这是非常安全的:)