
這個單字命令在Linux中指的是兩個不同的概念:
- 一個可執行程序,例如grep(或內建的 shell,例如光碟)。用法範例:“這是您應該學習的 10 個最重要的 Linux 命令。”
- 發送到 shell 執行的完整文字字串,例如grep com /etc/hosts。用法範例:“鍵入 Linux 命令並按 Enter。”
在撰寫有關 Linux 命令的散文時,有人有避免這種歧義的最佳實踐嗎?以下是我已經拒絕的一些嘗試:
- 使用這個詞程式或者執行檔對於意義#1。對於 shell 內建函數來說這是不準確的。
- 使用短語命令列對於意義#2。這很令人困惑,因為「命令列」也是「shell」的同義詞。
- 使用短語指令字串對於意義#2。它不精確,因為 #1 和 #2 都是字串。
任何建議表示讚賞。
答案1
POSIX指的是類似grep
和cd
作為的事物“公用事業」, 和儲備”命令” 的說明。如果使用一致,這些術語是明確的。
依序處理您的案件
“可執行程序,例如 grep(或內建 shell,例如 cd)”是一個公用事業:
公用事業一個程序,不包括特殊的內建實用程序作為 Shell 命令語言的一部分提供,可以從 shell 中按名稱呼叫以執行特定任務或相關任務集。
這是進一步澄清:
系統可以將某些實用程式實作為 shell 函數或內建實用程式
需要明確的是,這包含了普通的實用程序,例如
true
通常作為 shell 內建程式找到的實用程式。正式地,“特殊的內建實用程序" 與未進一步指定的實用程式分開;這些是諸如
break
、.
、eval
、set
和 之類的東西trap
,它們會影響 shell 的內部狀態,但它們不要includecd
,這是一個常規的內建函數。除了規範的細微差別需求(某些變數賦值行為不同且它們不可用於execvp
)之外,「實用程式」足以涵蓋使用者層級的這兩個類別。像if
和這樣的 shell 語法文章while
根本不是實用程式。“發送到 shell 執行的完整文字字串,例如
grep com /etc/hosts
”是一個命令:命令指示 shell 執行特定任務的指令。
命令確實包括簡單命令(例如
grep com /etc/hosts
、管道)和複合命令(例如if
使用 建構和分組命令)( ... )
,但「命令」一詞從來不指實用程式本身。在一個命令中,一個命令名稱可能會出現識別實用程式或函數:grep com /etc/hosts
is中的命令名稱grep
,指的是grep 實用程式。
用「命令」表示實用程式或功能的白話用法可以透過上下文消除歧義,但正式含義只是指令。如果需要完全避免歧義,您可以一致地使用“實用程式”和“命令”對於這兩個角色。
不過,您可能無法指望用戶自己做出這種區分,因此搜尋引擎優化的「十大 Linux 命令」文章可能會為他們的激勵做出正確的選擇。
答案2
概括
您在這裡提到的感知的歧義類型最好透過使用諸如程式, 一個執行檔,或者只是一個執行檔對於有/是一條路徑的,與外殼命令甚至命令列 當你想引用你輸入的所有內容時命令解釋器。
歷史背景
早期印刷品索引C 程式設計語言(“K&R”,Prentice-Hall)只提及該字一次命令,並不是專門針對這個詞,而是針對命令列參數。這個意義的小核心提供了發芽並衍生出所有後來用途的關鍵種子。摘自 1978 年印刷的第 111 頁:
5.11 命令列參數
在支援 C 的環境中,有一種方法可以在程式開始執行時將命令列參數或參數傳遞給程式。
也就是說,這個詞命令在 shell 上下文中唯一使用(因為 shell 根據定義是一個命令解釋器),無論是互動式使用還是腳本程式設計。作者繼續這個例子:
必要的聲明和使用的最簡單說明是程序
echo
,它只是在一行上回顯其命令列參數,並用空格分隔。也就是說,如果命令echo hello, world
給定,輸出為
hello, world
請注意 K&R 是如何談論程序和命令行的。換句話說,這就是 IEEE 的POSIX 1003.2就是關於不是什麼POSIX 1003.1是。一般來說,Dot-1 涵蓋 C 編程,而 Dot-2 涵蓋 shell 編程。
您在這裡真正討論的是 shell 程式設計而不是 C 程式設計。這就是為什麼介紹Unix 程式設計師手冊第 1 部分提到命令而不是函數呼叫:
姓名
intro — 通用命令介紹(工具和實用程式)
描述
第 1 節中的手冊頁包含構成 BSD 使用者環境的大部分指令。第1 節中包含的一些命令包括文字編輯器、命令shell 解釋器、搜尋和排序工具、檔案操作命令、系統狀態命令、遠端檔案複製命令、郵件命令、編譯器和編譯器工具、格式化輸出工具以及行式印表機命令。
所有命令在退出時都會設定一個狀態值,可以測試該狀態值以查看命令是否正常完成。退出值及其含義在各個手冊中進行了解釋。傳統上,值 0 表示指令成功完成。
如果您使用 1003.1 術語,您可以將其稱為字串參數這系統C 庫中的函數。這是因為它本身不是系統調用,而是在底層使用各種系統調用的函式庫函數,其中之一是
execve
。此系統呼叫採用常量
char *
參數作為其第一個參數,它是檔案系統中可執行檔的路徑。
已發布的解決方案
一項已發布的解決方案始終使用以下定義:
執行檔
A文件是專門標記來告訴作業系統可以將此文件作為程式運行。通常縮寫為“可執行”。
命令
在殼編程,程序名稱及其參數的語法組合。更寬鬆地說,您在 shell(命令解釋器)中鍵入的任何內容都會啟動它執行某些操作。 [...]
命令列參數
當您告訴 a 時您提供的值以及程式名稱 殼執行一個命令。 [...]
命令名稱
的名稱程式目前正在執行,如在命令列。 [...]
摘自第四版Perl程式(O'Reilly),此處使用已獲得該書作者的許可。 :)。
如果幸運的話,您可以自己找到所有這些內容,甚至更多,只需在 shell 中輸入這個簡單的命令列即可運行男人為您提供的可執行檔/程式:
man perlglossary
但如果你沒那麼幸運的話你也可以在這裡找到它們。
外殼命令
這可能是一個 shell 指令:
exec 2>errs.out
請注意,那裡什麼也沒有exec
;我們剛剛重新排列了文件描述符。
這裡同上:
exec 5<&0 # save old stdin
exec 0<&3 # read some_var
exec 0<&4 # read another_var
exec 0<&5 # restore it
execve
因此,腳本中的每一行都是一個“命令”,即使在這裡(我將完整運行時產生的實際系統呼叫數作為練習留給讀者):
#!/bin/sh
device=/dev/rmt8
dd_noise='^[0-9]+\+[0-9]+ records (in|out)$'
exec 3>&1
status=`((dd if=$device ibs=64k 2>&1 1>&3 3>&- 4>&-; echo $? >&4) | egrep -v "$dd_noise" 1>&2 3>&- 4>&-) 4>&1`
exit $status
取自可敬的傑瑞米亞德Csh 程式設計被認為是有害的,經善意允許再次在這裡使用等等等等。 :)
答案3
一個相當簡單的解決方案(以及標準的哲學和語言迴避)是為了區分使用這個單字命令, 和提及這個單字命令。例如,某些單字執行動作,即使在普通英語中也是如此,它們的使用就是它們執行動作的方式。例如,如果你在適當的情況下說“我願意”,你可能會結婚。但如果你引用別人可能說的話就不行了。引用的任何內容都是提及,而不是使用。
所以第一個命令列表不是命令的使用;而是命令的使用。他們提到了命令。
第二個例子,就像我最喜歡的
$ rev wordlist | sort | rev > speculum
(生成 的逆字母順序副本wordlist
)
實際上會做某事,所以它們肯定是用途。
答案4
我會考慮沒有必要作為答案,因為所描述的歧義無論如何不會造成任何傷害。
在我見過的所有上下文中,當「命令」一詞指稱可執行程式時,最終使用者總是會在 shell 中鍵入命令以使其運行。我從未見過這樣的表達“init
命令“ 或者 ”ld-linux.so
命令」。
當「命令」指的是命令列程式時,它實際上總是指「以該程式開頭的命令系列」。例如,當你說“grep
命令”,你談論的是你可以用程式做的所有事情grep
,它形成了“一系列命令”。這也適用於部分命令,就像俗話“此apt install
指令用於安裝軟體包" 當完整指令apt install
通常沒有任何作用時。