在 Linux 中消除“命令”一词的歧义

Dan*_*anB 12 terminology

命令这个词在 Linux 中指的是两个不同的概念:

  1. 一个可执行程序,例如grep(或内置的 shell,例如cd)。用法示例:“这是您应该学习的前 10 个 Linux 命令。”
  2. 发送到 shell 以供执行的完整文本字符串,例如grep com /etc/hosts。用法示例:“键入 Linux 命令并按 Enter。”

在编写有关 Linux 命令的散文时,有没有人有避免这种歧义的最佳实践?以下是我已经拒绝的一些尝试:

  • 使用“程序”或“可执行”一词来表示#1。对于 shell 内置函数来说这是不准确的。
  • 使用短语命令行来表示 #2。这令人困惑,因为“命令行”也是“shell”的同义词。
  • 使用短语命令字符串表示#2。这是不精确的,因为 #1 和 #2 都是字符串。

任何建议表示赞赏。

Mic*_*mer 17

POSIX指的是喜欢的东西grep,并cd为“公用事业,并保留“命令”的说明。一致使用,这些术语是明确的。


依次处理您的案件

  1. “可执行程序,例如 grep(或内置的 shell,例如 cd)”是一个实用程序

    实用程序A 程序,不包括作为 Shell 命令语言的一部分提供的特殊内置实用程序,可以从 Shell 通过名称调用以执行特定任务或相关任务集。

    进一步澄清了

    系统可以将某些实用程序实现为 shell 函数或内置实用程序

    明确地说,这包含了普通的实用程序,如 true通常作为 shell 内置找到的。

    形式上,“特殊内置实用程序”与未进一步指定的实用程序分开;这些是诸如break, ., eval,set和 之类的东西trap,它们会影响 shell 的内部状态,但它们包括cd,它是一个常规的内置函数。除了规范的细微差别(某些变量赋值行为不同,它们不可用于execvp),“实用程序”足以涵盖用户级别的两个类别。诸如if和之类的 shell 语法文章while根本不是实用程序。

  2. “发送到 shell 执行的完整文本字符串,例如grep com /etc/hosts是一个命令

    命令对 shell 执行特定任务的指令。

    命令确实包括简单的命令,如grep com /etc/hosts、管道和复合命令,如使用if构造和分组命令( ... ),但“命令”一词从不指实用程序本身。在一个命令中,可能会出现一个命令名称来标识一个实用程序或一个函数:grep com /etc/hostsis 中的命令名称grep,指的是 grep 实用程序


使用“命令”来表示实用程序或功能的白话用法可能会因上下文而消除歧义,但其正式含义仅是指令的含义。如果需要完全避免歧义,您可以对这两个角色始终使用“实用程序”和“命令”

不过,您可能无法指望用户自己做出这种区分,因此搜索引擎优化的“前 10 个 Linux 命令”文章可能会为他们的激励做出正确的选择。


tch*_*ist 5

概括

该类型您参考这里感知不确定性的最好使用这样的术语作为补救程序,一个可执行文件,或仅仅是一个可执行文件为一个有/是一个路径,与shell命令,甚至命令行 ,当你想引用的一切你输入你的命令解释器


历史背景

The C Programming Language(“K&R”,Prentice-Hall)的早期印刷品索引仅包含一个单词command 的提及,并且不是专门针对该单词,而是针对命令行参数。这种意义的小内核提供了萌芽并衍生到所有后续用途的关键种子。来自 1978 年印刷品的第 111 页:

5.11 命令行参数

在支持 C 的环境中,有一种方法可以在程序开始执行时将命令行参数或参数传递给它。

也就是说,命令这个词在 shell 上下文中是唯一使用的(因为 shell 根据定义是一个命令解释器),无论是在交互式使用中还是在脚本编程中。作者继续这个例子:

必要声明和使用的最简单说明是 program echo,它只是在一行中回显其命令行参数,以空格分隔。也就是说,如果命令

echo hello, world
Run Code Online (Sandbox Code Playgroud)

给定,输出为

 hello, world
Run Code Online (Sandbox Code Playgroud)

请注意 K&R 如何在那里谈论程序和命令行。换句话说,它就是IEEE的POSIX 1003.2是一回事,没有什么POSIX 1003.1的。一般而言,Dot-1 涵盖 C 编程,而 Dot-2 涵盖 shell 编程。

你在这里真正谈论的是 shell 编程而不是 C 编程。这就是为什么Unix Programmer's Manual 第 1 部分的介绍提到命令而不是函数调用的原因:

姓名

intro — 介绍一般命令(工具和实用程序)

描述

第 1 节中的手册页包含构成 BSD 用户环境的大部分命令。第 1 节中包含的一些命令是文本编辑器、命令外壳解释器、搜索和排序工具、文件操作命令、系统状态命令、远程文件复制命令、邮件命令、编译器和编译器工具、格式化输出工具和行式打印机命令.

所有命令在退出时都会设置一个状态值,可以测试该值以查看命令是否正常完成。各个手册中解释了退出值及其含义。传统上,值 0 表示命令成功完成。

如果你在1003.1行话来说,你可以把它称为字符串参数系统在C库函数。那是因为它不是系统调用本身,而是一个库函数,它在后台使用了各种系统调用,其中之一是 execve. 该系统调用需要一个常数 char *参数作为它的第一个参数,它是文件系统中可执行文件的路径。

已发布的解决方案

一个已发布的解决方案始终使用以下定义:

可执行文件

一个专门标记的文件,用于告诉操作系统可以将此文件作为程序运行。通常简称为“可执行”。

命令

shell编程中,程序名称及其参数的句法组合。更松散地,你输入到一个 shell(一个命令解释器)中的任何东西都会启动它做某事。[...]

命令行参数

当您告诉shell执行命令时,您提供的值以及程序名称 。[...]

命令名

当前正在执行的程序的名称,在命令行中输入。[...]

        摘自《Programming Perl》(O'Reilly)的第四版,经该书作者许可使用。:)

如果你很幸运,你可以自己找到所有这些,甚至更多,只需在你的 shell 中输入这个简单的命令行,以便它为你运行man可执行文件/程序:

man perlglossary
Run Code Online (Sandbox Code Playgroud)

但如果你不是那么幸运,你也可以在这里找到它们

外壳命令

这可能是一个 shell 命令:

exec 2>errs.out
Run Code Online (Sandbox Code Playgroud)

请注意,exec那里什么都没有;我们刚刚重新排列了一个文件描述符。

同上:

exec 5<&0   # save old stdin
exec 0<&3   # read some_var
exec 0<&4   # read another_var
exec 0<&5   # restore it
Run Code Online (Sandbox Code Playgroud)

因此,脚本中的每一行都是一个“命令”,即使在这里也是如此(我将execve它在完整运行时产生的实际系统调用数量留给读者作为练习):

#!/bin/sh
device=/dev/rmt8
dd_noise='^[0-9]+\+[0-9]+ records (in|out)$'
exec 3>&1
status=`((dd if=$device ibs=64k 2>&1 1>&3 3>&- 4>&-; echo $? >&4) | egrep -v "$dd_noise" 1>&2 3>&- 4>&-) 4>&1`
exit $status
Run Code Online (Sandbox Code Playgroud)

取自古老的 jeremiad Csh Programming Considered Harmful,再次通过善意许可在这里使用等等等等。:)


小智 1

一个相当简单的解决方案(以及标准的哲学和语言学回避)是区分使用命令一词提及命令一词。例如,某些单词执行动作,即使在普通英语中也是如此,它们的使用就是它们执行动作的方式。例如,如果你在适当的情况下说“我愿意”,你可能会结婚。但如果你引用别人可能说的话就不行了。引用的任何内容都是提及,而不是使用。

所以第一个命令列表不是命令的使用;而是命令的使用。他们提到了命令。

第二个例子,就像我最喜欢的

  • $ rev wordlist | sort | rev > speculum
    (生成 的逆字母顺序副本wordlist

实际上会做某事,所以它们肯定是用途。