我试图更好地了解命令行的工作方式
在参数,选项和子命令方面我有点困惑
让我们想象一下maven(一种Java构建工具):
$file = "\\xxxxx\xxxxxx\xxxxxxx\test.log"
try {
[IO.File]::OpenWrite($file).Close();
exit 0
} catch {
exit 999
}
$exit | Out-File -FilePath "C:\stuff\PSOutput.txt"
mvn是命令行程序。但是什么是“干净”和“安装”?它们是参数还是子命令?
让我们想象另一个例子:
mvn clean install
prog是命令行程序。 -a是一个选项,arg是一个参数。您怎么知道arg是属于'prog'的参数还是属于选项'-a'的参数?
谢谢
答案 0 :(得分:1)
它们是参数还是子命令
这取决于。如果程序的参数具有层次结构,则它们将是子命令,例如:
docker image ls
(docker
程序有一个命令/命令组image
和一个子命令ls
。)
如果程序采用参数来表示串行执行,则它们将只是参数,例如:
mvn clean install
(mvn
程序将首先执行clean
生命周期,然后在install
生命周期中执行直至default
阶段,请参见here。)
我看到参数通常具有有意义的顺序,例如在Maven中,而选项通常可以放置在任何地方。对于Maven,有类似-D...
,-e
,-U
之类的参数(要提到一些常见的参数)。他们可以去任何地方:
mvn -e clean -DskipTests install -Dcheckstyle.skip=true ... et cetera
对于其他程序,选项的顺序可能很重要,例如find
has "tests"。它们看起来像选项(从某种意义上来说,它们带有-option
表示法),尽管有人可以说它们是参数。换句话说,取决于。
prog -a arg
您怎么知道arg是属于'prog'的参数还是属于选项'-a'的参数
同样,这取决于 a
选项的定义。如果不带参数,则有时称为 flag 。如果确实接受参数,则该参数是选项说明的一部分,并且程序的命令行解析器可以解决这个问题。
我个人从使用Click构建命令行工具中学到了很多东西。 (绝不是专家。)