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

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

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

答案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 進程的結果。

相關內容