什麼被認為是古老而強大的命令?
我遇到了 awk 和 sed 這兩個術語,awk 遍歷所有行並在行滿足特定條件時執行任務,sed 可以在輸入流進一步輸出之前對其進行操作。我個人不知道使用它們的目的是什麼,但我注意到它們被稱為強大甚至神聖的命令。除了這兩個,還有哪些命令/應用程序具有這樣的狀態?
要定義“強大的”命令,首先必須確定這意味著什麼。
第一個要求是普遍性。有些工具非常專注於一件事,但可以解決非常廣泛的問題。
gnuplot
是一個非常基本的繪圖工具,非常好,即使在科學界,你幾乎不需要任何其他東西。而一個可以處理正則表達式的工具,幾乎可以用於任何事情,這確實sed
是非常強大的原因。您可以在格式之間進行轉換、數據提取、解析、搜尋、替換以及幾乎任何您能想像到的事情。awk
相似,但也非常不同:它更多地用於結構化數據,根據模式逐行解析,並且更接近更傳統的程式語言(具有更多控制流等)。一旦掌握了這些工具,你就可以用它們解決任何問題:兩者都是圖靈完備的,原則上可以解決任何問題,即使它與字元串處理無關——通用性是最高級別的權力:你可以做任何事情。但是你必須“想要”嘗試和玩它。由此遵循下一個要求。第二個組成部分是遺留和傳統:已經存在 40 年並擁有龐大程式碼庫的命令也是最穩定(長期開發)、最可靠(它們不能停止開發或更改功能,因為 40 年腳本會中斷),並且有大量可以施展魔法的大師。這意味著廣為人知且被許多人首選使用的工具,不一定是一開始最好的工具,而是“卡住”的工具。但是,如果很多人使用它,它可能還不錯,即使有些事情可以做得更好。時代在這裡很重要:
python
作為一種語言非常強大,但還沒有達到舊gnu
工具包的地位——它仍然給人一種新奇的感覺。bash
是一個黃金標準,不僅因為它直覺且強大,還因為它作為預設 shell 幾乎無處不在,每個人都在使用它。邪教地位在這裡非常重要:人們為成為某些極客亞文化的一部分而感到自豪。我可以直接告訴你,當我掌握
emacs
和時,我感覺真的很酷latex
,而且幾乎立刻就接受了仇恨vi
:部分原因是它對我個人來說確實不是一個直覺的界面,但當然,當你發現時,這一點會得到加強其他人也有這種感覺。我想說的是,一個強大的工具在社交方面也很強大:一個鮮為人知或設計不佳的工具無法激起人們如此強烈的情緒(既不是消極的也不是積極的——它們只是平淡無奇)。我提到的一些工具擁有可以與 Trekkies 相提並論的追隨者——對於一款軟體來說,這是一個不錯的成就。awk
可以被認為是 的前身perl
,並且perl
肯定有追隨者:大多數人都認為perl
它的易讀性很差,而且有很多笨拙的怪癖。它也是目前最強大的以字元串為中心的語言,但如果沒有狂熱的地位,大多數人可能會很快放棄它,而不是四處玩耍,試圖拯救世界,用同樣的工具做飯一堆網頁。最後,人們喜歡一致性、優雅和個性……一個工具在功能方面可能很強大,但沒有人願意使用它,因為它感覺不對。一個強大的工具必須至少對喜歡使用它的人來說是直覺的。我不是在這裡發起激烈的爭吵,但大多數讀者肯定會找到他們自己的不幸和笨拙設計的例子。
簡而言之:為明確定義的目的而精心設計、普遍、大量的遺產和追隨者,以及……一個“靈魂”。那將是我的定義。
對一些“舊”命令進行分類的一種方法——儘管不是“更強大”——是它們是內置命令,即從 shell 呼叫的命令或函式,它直接在 shell 本身中執行,而不是外部shell 將載入和執行的可執行程序。
範例包括註銷、cd、echo 和歷史記錄。
您可以查看命令是否是內置命令
builtin [command]
例如
builtin echo
沒有輸出意味著它是一個內置的(使用 unix 哲學沒問題)
如果命令不是內置命令,例如 ls 那麼
builtin ls
返回錯誤
-bash builtin: cp: not a shell builtin
至於諸如
sed
and之類的“最強大”命令awk
,我實際上會將其從問題中刪除,因為它似乎非常主觀,不太可能導致明確的論點。