命令行术语:命令的这些部分叫什么?

the*_*sti 23 command-line parameter terminology command

在命令行中,我经常使用“简单”命令,例如

mv foo/bar baz/bar
Run Code Online (Sandbox Code Playgroud)

但我不知道如何称呼这一切:

?1? ???2????
git checkout master
?   ???????3???????
????????4??????????
Run Code Online (Sandbox Code Playgroud)

我(认为我)知道1是命令,2是参数,我可能会称3为参数列表(对吗?)。

但是,我不知道该怎么称呼4

如何标记更复杂的“命令”?

find transcripts/?.? -name '*.txt' | parallel -- sh -c 'echo $1 $2' {} {/}
Run Code Online (Sandbox Code Playgroud)

我很感激一个答案,它分解了调用 1,2,3,4 的内容以及调用上面的“命令”的每个部分的内容。

了解其他我没有包括在这里的独特/令人惊讶的事情会很棒。

ImH*_*ere 33

各部分的通用名称如下:

?1? ???2????
git checkout master
?   ???????3???????
????????4??????????
Run Code Online (Sandbox Code Playgroud)
  1. 命令名称(不是重定向或变量赋值的命令行的第一个单词或标记,并且在别名被扩展之后)。

  2. 命令的标记、单词或参数。从人bash:

    word:被 shell 视为一个单元的字符序列。也称为令牌。

  3. 一般:参数

  4. 命令行。


两个带有 a 的简单命令的串联|是管道序列或管道:

??1? ???????2??????? ??2?? ???2???   ???1???? ?2??2??2??????2?????? ?2? ?2?
find transcripts/?.? -name '*.txt' | parallel -- sh -c 'echo $1 $2'  {} {/}
?    ?????????????3???????????????            ?????????????3???????????????
????????????????????????????????????4??????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

请注意,还有重定向和变量分配:

???5??? ?1? ??2?? ??2??   ????6??? ?1? ??5??
<infile tee file1 file2 | LC_ALL=C cat >file
??????????7????????????   ????????7?????????
??????????????????????4?????????????????????
Run Code Online (Sandbox Code Playgroud)

哪里(除了上面的数字):

  1. 重定向。
  2. 变量赋值。
  3. 简单的命令。

这不是命令行可能具有的所有元素的详尽列表。这样的列表对于这个简短的回答来说太复杂了。

  • 在 POSIX 术语中,你所说的 _pipe_ 是一个 _pipe sequence_ 或 _pipeline_(尽管一个管道可以有一个可选的前导 `!` 来否定它的状态)。_pipe_ 更倾向于指大多数 shell 用于实现管道的 IPC 机制(管道不必使用管道,例如 ksh93 在某些系统上使用 socketpairs)。一些 shell 有更多的关键字,如 `time`、`noglob`,可以在这里代替或与 `!` 一起使用。 (3认同)
  • **恕我直言,这些东西被称为参数——别无他物**所以我认为这个上下文中的单词token的意思是“bash语法的原子单位”。这里的术语令牌只存在于*shell 命令行* 的上下文中,而不存在于程序执行的上下文中。说“这些是程序标记”会有点奇怪,但说“命令行中的第二个标记是 $test”可能就不那么奇怪了。在 `cat $file` 中出现了一个区别,这里我会说 `$file` 是一个标记,但 file 的 *value* 是参数。 (2认同)
  • @TOOGAM **“我看到的是参数”**。嗯,我认为你是对的。根据 POSIX 规范:“shell 执行函数(请参阅函数定义命令)、内置(请参阅特殊内置实用程序)、可执行文件或脚本,将参数的名称作为编号为 1 到 n 的位置参数,以及命令的名称(或者在脚本中的函数的情况下,脚本的名称)作为编号为 0 的位置参数(请参阅命令搜索和执行)。” 这些年来我一直都错了......虽然在我的辩护中它被称为`argv` (2认同)

Att*_*igh 16

@isaac 上面的回答似乎不错。

我想用一些来源来扩展它。

我想POSIX 标准在某种意义上可能被认为是规范的。其他来源可能是man bashman proc

?1? ???2????
git checkout master
?   ???????3???????
????????4??????????
Run Code Online (Sandbox Code Playgroud)

POSIX 建议:

  1. 命令名称(而不是命令,尽管本文档在某些地方使用命令)
  2. 争论
  3. 参数
  4. 命令(虽然man proc使用命令行

它还具有许多更复杂命令的术语。

我认为命令非常含糊,所以也许术语命令名称命令行是为了清晰起见。j

  • +1 我最喜欢这个答案。(在这个特定的上下文中,**2** 是一个 **子命令**,但通常是,一个参数)。 (5认同)