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


21

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

mv foo/bar baz/bar

但我不知道该怎么称呼它的所有部分:

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘

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

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

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

find transcripts/?.? -name '*.txt' | parallel -- sh -c 'echo $1 $2' {} {/}

我希望能得到一个答案,该答案细分了上面所谓的“ 1、2、3、4”以及该“命令”的各个部分的名称。

最好也了解一下我这里未包括的其他独特/令人惊讶的事物。


1
你看在mangitfind特别的简介部分?
fpmurphy

4
你有没有看的手册页git的,找到这样的问题似乎无关的gitfind比较笼统的术语对于Linux。
Att Righ

根据中的bash手册页所述A | B,它A | B是一个管道A并且B命令(很遗憾,它的名称与命令中的第一个世界相同)。我可能将第一个参数称为可执行文件,但找不到与我同意的源。
Att Righ

4
在的上下文中git checkout ...checkout子命令,在的上下文中sh -c ...-c选项
wjandrea

@JoL感谢您指出这一点。你猜对了,我已经编辑了。这是因为当我尝试正确执行该部分时,我将其重写了大约4次
theonlygusti

Answers:


33

每个部分的通用名称如下:

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘
  1. 命令名称(不是重定向或变量分配的命令行的第一个单词或标记,在别名已扩展之后)。

  2. 命令的令牌,单词或参数。来自man bash:

    单词:shell认为是单个单元的一系列字符。也称为令牌。

  3. 通常:参数

  4. 命令行。

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

┌─1┐ ┌──────2──────┐ ┌─2─┐ ┌──2──┐   ┌──1───┐ ┌2┐┌2┐┌2┐┌────2─────┐ ┌2┐ ┌2┐
find transcripts/?.? -name '*.txt' | parallel -- sh -c 'echo $1 $2'  {} {/}
│    └────────────3──────────────┘            └────────────3──────────────┘
└───────────────────────────────────4─────────────────────────────────────┘

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

┌──5──┐ ┌1┐ ┌─2─┐ ┌─2─┐   ┌───6──┐ ┌1┐ ┌─5─┐
<infile tee file1 file2 | LC_ALL=C cat >file
└─────────7───────────┘   └───────7────────┘
└─────────────────────4────────────────────┘

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

  1. 重定向。
  2. 变量分配。
  3. 简单的命令。

这不是命令行可能包含的所有元素的详尽列表。对于这个简短的答案,这样的列表太复杂了。


2
用POSIX术语来说,管道管道序列管道(尽管管道可以有一个可选的引号!来否定其状态)。pipe宁愿引用大多数shell用来实现管道的IPC机制(例如,管道不必使用管道,ksh93在某些系统上使用套接字对代替)。某些shell具有更多的关键字,例如timenoglob可以在!此处代替或除此之外使用。
斯特凡Chazelas

1
恕我直言,这些东西称为自变量-别无其他,因此我认为“令牌”一词在此上下文中表示“ bash语法的原子单位”。在这里,术语令牌仅存在于shell命令行的上下文中,而不存在于程序执行的上下文中。说“这些是程序令牌”会有些怪异,但说“命令行中的第二个令牌是$ test”可能就不那么奇怪了。会出现一个区别,在cat $file这里我要说的$file是令牌,但是file 的是参数。
Att Righ

1
@PeterCordes您是正确的,<<<“…”是重定向,而不是参数。虽然它仍然是该行的标志。对困惑感到抱歉。
艾萨克(Isaac)

1
@TOOGAM那些与标准定义完全相反。调用者提供的东西是参数;cf. “正式参数”,或此SO问题
迈克尔·荷马

1
@TOOGAM “我看到的是参数”。嗯,我认为你是对的。根据POSIX规范:“外壳程序执行一个函数(请参见功能定义命令),内置(请参见Special Built-In Utilities),可执行文件或脚本,并给出参数名称作为位置参数,编号从1到n,以及命令名称(或脚本中的函数,脚本名称)作为位置参数编号0(请参阅命令搜索和执行)。” 这些年来我一直做错了...尽管在我的辩护中叫它argv
Att Righ,

15

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

我想用一些资料来扩展它。

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

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘

POSIX建议:

  1. 命令名称(而不是命令,尽管本文档甚至在地方使用命令)
  2. 争论
  3. 争论
  4. 命令(尽管man proc使用命令行

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

我认为命令是非常含糊的,所以也许术语“ 命令名称”和“ 命令行”可以使代码清晰。


proc是什么?我从未听说过。
theonlygusti


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

@theonlygusti proc是一个专用的文件系统(文件集合),提供有关内核内部状态的信息。我相信它代表流程(另请参阅 sysfs,它提供有关流程以外的事物的信息)。相关性的原因是由内核开发人员编写的,因此很可能反映出他们使用的语言,这可能会更加正式。
Att Righ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.