我找不到任何将其称为其中之一的官方文档。无论如何,命令和操作员之间的技术区别到底是什么?
答案1
答案2
一条命令:
通常有一个字母数字字符串作为其名称。
是外部 util、内置工具或函数。从这个意义上说,内置函数生成输出的大多数内容
type
都是命令。有字首符号。
通常会更改某种 I/O。
操作员:
通常是一个符号字符串,可能没有名字,但可能有昵称。
内置函数无法理解
type
(除非可能存在一些名称混乱的函数或脚本)。更多时候有中缀或者后缀句法。
有时像交通警察一样指挥 I/O,但不会改变内容在它。
有时指导流程的顺序。
$()
是一个命令代换:
- 首先,(或者最后,取决于我们如何看待它),它是一个字符串。
- 该字符串由文本组成输出其中列出的命令。
[
是一个 shell 内置命令:
- 这是
test
带有强制]
后缀的命令。
[[
是一个bash
shell 关键字:
- 它就像一个更通用、更快的
[
内置命令,但 SFAIK 没有相应的test
类似命令。 shell 关键字包括
time
and之类的东西for
,它们看起来像命令,但行为更像运算符,需要各种同级关键字作为分隔符和语法。此代码type
在内置函数的输出上运行内置函数help
,其中显示左侧关键字和内置函数的列表:COLUMNS=30 help -m | tail -n +9 | tee >(cut -d ' ' -f2) >(cut -c 17-30 | cut -d ' ' -f1) > /dev/null | sort | sed -n "s/.*/type '&'/e"';/found/!p'
将其与口语进行比较:
- 命令(和一些关键字)就像动词。
- 文件和字符串是名词。
- 运算符就像标点符号和介词。
抽象而言,运算符只是具有不同语法的命令,可以用类似的命令替换字首样式命令以及其他命令。使用起来可能不太方便。
从分析上来说,shell 的编译代码可以通过反汇编器运行,而操作符又只是命令,或者更确切地说是一系列汇编语言命令。
答案3
从用户的角度来看,命令替换是一种 shell 原语。它是在 shell 中实现的一项功能,可以执行多个操作(启动子 shell、执行命令...)并返回一个值(命令的输出)。在 shell 执行扩展之前,命令替换通常是命令的参数。换句话说,用户使用 shell 功能获取 shell 进程的结果。