Command-Substitution

命令替換語法 $() 是否被視為運算符或命令?

  • August 30, 2018

我找不到任何將其稱為其中之一的官方文件。無論如何,命令和操作員之間的技術區別到底是什麼?

一個命令:

  • 通常有一個字母數字字元串作為其名稱。
  • 是外部工具、內置工具或函式。type從這個意義上說,內置生成輸出的 大多數東西都是命令。
  • 前綴符號。
  • 通常會更改某種 I/O。

運營商:

  • 通常是一個符號字元串,可能沒有名字,但可能有暱稱。
  • 內置函式不理解type,(除非可能有一些混淆命名的函式或腳本)。
  • 更多時候有中後綴語法。
  • 有時像交通警察一樣指揮 I/O,但不會改變其中的內容
  • 有時指示過程的順序。

$()是命令替換

  • 首先,(或最後,取決於我們如何看待它),它是一個字元串。
  • 該字元串由其中列出的那些命令的文本輸出組成。

[是一個 shell 內置命令:

  • 它是test帶有強制]後綴的命令。

[[是一個bashshell 關鍵字:

  • 它就像一個更通用、更快的[內置函式,但 SFAIK 沒有相應的 -liketest命令。
  • timeshell 關鍵字包括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 的編譯程式碼可以通過反彙程式序執行,並且操作符再次只是命令,或者更確切地說是一系列彙編語言命令。

POSIX 中的文本在2.6 Word Expansions下列出了它,以及波浪號擴展、參數擴展、算術擴展、欄位拆分、路徑名擴展和引號刪除。

同樣,Bash 的手冊將其列在Shell Expansions下。

前者將“運算符”用於重定向運算符,以及;, &, |, &&,等||(因此它不是其中之一。這顯然也不是一個命令,所以無論術語是否重要,我不得不說這兩者都不是。

引用自:https://unix.stackexchange.com/questions/465227