命令替换语法 $() 是否被视为运算符或命令?

命令替换语法 $() 是否被视为运算符或命令?

我找不到任何将其称为其中之一的官方文档。无论如何,命令和操作员之间的技术区别到底是什么?

答案1

POSIX 中的文本将其列出在下面2.6 词扩展,以及波形符扩展、参数扩展、算术扩展、字段拆分、路径名扩展和引号删除。

同样,Bash 的手册将其列出在下面外壳扩展

前者使用“operator”作为重定向运算符,以及;&|&&、等||(因此它不是其中之一。显然它也不是一个命令,所以无论术语有多重要,我都不得不说这两者都不是。

答案2

一条命令:

  • 通常有一个字母数字字符串作为其名称。

  • 是外部 util、内置工具或函数。从这个意义上说,内置函数生成输出的大多数内容type都是命令。

  • 字首符号。

  • 通常会更改某种 I/O。

操作员:

  • 通常是一个符号字符串,可能没有名字,但可能有昵称。

  • 内置函数无法理解type(除非可能存在一些名称混乱的函数或脚本)。

  • 更多时候有中缀或者后缀句法。

  • 有时像交通警察一样指挥 I/O,但不会改变内容它。

  • 有时指导流程的顺序。

$()是一个命令代换:

  • 首先,(或者最后,取决于我们如何看待它),它是一个字符串。
  • 该字符串由文本组成输出其中列出的命令。

[是一个 shell 内置命令:

  • 这是test带有强制]后缀的命令。

[[是一个bashshell 关键字:

  • 它就像一个更通用、更快的[内置命令,但 SFAIK 没有相应的test类似命令。
  • shell 关键字包括timeand之类的东西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 进程的结果。

相关内容