Command-Substitution
命令替換語法 $() 是否被視為運算符或命令?
我找不到任何將其稱為其中之一的官方文件。無論如何,命令和操作員之間的技術區別到底是什麼?
一個命令:
- 通常有一個字母數字字元串作為其名稱。
- 是外部工具、內置工具或函式。
type
從這個意義上說,內置生成輸出的 大多數東西都是命令。- 有前綴符號。
- 通常會更改某種 I/O。
運營商:
- 通常是一個符號字元串,可能沒有名字,但可能有暱稱。
- 內置函式不理解
type
,(除非可能有一些混淆命名的函式或腳本)。- 更多時候有中綴或後綴語法。
- 有時像交通警察一樣指揮 I/O,但不會改變其中的內容。
- 有時指示過程的順序。
$()
是命令替換:
- 首先,(或最後,取決於我們如何看待它),它是一個字元串。
- 該字元串由其中列出的那些命令的文本輸出組成。
[
是一個 shell 內置命令:
- 它是
test
帶有強制]
後綴的命令。
[[
是一個bash
shell 關鍵字:
- 它就像一個更通用、更快的
[
內置函式,但 SFAIK 沒有相應的 -liketest
命令。time
shell 關鍵字包括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下。
前者將“運算符”用於重定向運算符,以及
;
,&
,|
,&&
,等||
,(
因此它不是其中之一。這顯然也不是一個命令,所以無論術語是否重要,我不得不說這兩者都不是。