Shell
程序是否可以在 POSIX 中獲取命令行參數之間的空格數?
假設我使用以下行編寫了一個程序:
int main(int argc, char** argv)
現在它通過檢查
argv
.程序可以檢測參數之間有多少空格嗎?就像我在 bash 中鍵入這些內容時一樣:
ibug@linux:~ $ ./myprog aaa bbb ibug@linux:~ $ ./myprog aaa bbb
環境是現代 Linux(如 Ubuntu 16.04),但我想答案應該適用於任何符合 POSIX 的系統。
談論“論點之間的空格”是沒有意義的;這是一個外殼概念。
shell 的工作是獲取整行輸入並將它們組成參數數組以啟動命令。這可能涉及解析帶引號的字元串、擴展變數、文件萬用字元和波浪號表達式等等。該命令以標準
exec
系統呼叫開始,該呼叫接受字元串向量。存在其他方法來創建字元串向量。許多程序通過預先確定的命令呼叫來分叉和執行它們自己的子程序——在這種情況下,永遠不會有“命令行”這樣的東西。類似地,當使用者拖動文件圖示並將其放在命令小元件上時,圖形(桌面)外殼可能會啟動一個程序 - 同樣,沒有文本行可以在“參數之間”包含字元。
就呼叫的命令而言,shell 或其他父/前程序中發生的事情是私有的和隱藏的——我們只看到標準 C 指定
main()
可以接受的字元串數組。
一般來說,沒有。命令行解析由 shell 完成,它不會使未解析的行對被呼叫程序可用。實際上,您的程序可能是從另一個創建 argv 的程序執行的,該程序不是通過解析字元串,而是通過以程式方式構造參數數組。