为什么命令行参数前有「-」也有「--」

Linux命令行指定参数,有的是用一条竖线「-」,有的是用两条竖线「–」,为什么会有这种区别呢。

例如,查看版本。

1
2
3
python3 --version
python3 -V
java -version

Linux命令行,到底是 - 还是 – 是由其风格决定的,当前主流的风格有如下几种:

  • Unix 风格参数,前面加「-」
  • GNU 风格参数,前面加「–」
  • BSD 风格参数,前面不加符号

Unix风格参数

单破折号「-」开头,后面参数为一个字母,也称为短选项,比如:

1
2
3
ls -l
ls -a
ll -al

之所以有的会有多个字母,是对多个参数的整合,ll -al实际上等同于ll -a -l

短选项的参数

当短选项需要加参数时,参数和选项间用空格分隔。

1
tail -n 20 example.log

短选项的限制

Unix分隔有一定限制:

  • 单独字母的数量有限,可能存在不够用的情况。
  • 表达的意思不够明确。

GNU 风格

双破折号 「–」开头,后边参数为单词或短语,也称为长选项,比如:

1
2
python --version
python --help

长选项的参数

当长选项需要加参数时,参数和选项间用空格或者=分隔。

1
tail -n 20 example.log

BSD 分隔

无需开头符号,后边参数为一个字母

1
ps aux

java的特例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
~(master*) » java -V
Unrecognized option: -V
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
------------------------------------------------------------
~(master*) » java --version
Unrecognized option: --version
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
------------------------------------------------------------
~(master*) » java -version
openjdk version "1.8.0_112-release"
OpenJDK Runtime Environment (build 1.8.0_112-release-b403)
OpenJDK 64-Bit Server VM (build 25.112-b403, mixed mode)

Java9已经解决了这个问题。java --versionjava -version都可以正常得到结果。