在我看來,這是一個非常無知的問題,但它真的讓我感到困擾。我正在用C編寫一個簡單的shell,我想用其他shell所做的相同的方式來實現用戶輸入,或者至少bash是如何做的(從來沒有用過其他的)。如果輸入帶有隨機空格的命令,則它仍然可以運行命令:爲外殼準備一個輸入
ex。
ls -1
顯然分離指令和args當這個strtok()
不會工作...
如何bash中做到這一點?我應該通過數千行源代碼搜索嗎?
感謝
在我看來,這是一個非常無知的問題,但它真的讓我感到困擾。我正在用C編寫一個簡單的shell,我想用其他shell所做的相同的方式來實現用戶輸入,或者至少bash是如何做的(從來沒有用過其他的)。如果輸入帶有隨機空格的命令,則它仍然可以運行命令:爲外殼準備一個輸入
ex。
ls -1
顯然分離指令和args當這個strtok()
不會工作...
如何bash中做到這一點?我應該通過數千行源代碼搜索嗎?
感謝
您可以跳過空格,而你解析你的命令:
while(*p==' '||*p=='\t') ++p;
是的,這正是我現在所擁有的。這是最實踐的方式嗎? – 2011-06-11 01:21:00
其實,如果參數在引號內包含空格呢?這種方法的一個缺陷 – 2011-06-11 01:30:38
我沒有看到缺陷,你只能在參數之間調用空間吃法,引用字符串提取方法知道讀空格。 – Blindy 2011-06-11 01:32:40
空格都沒有問題。你可以刪除所有不需要的空白。 但我不確定這個shell是以這種方式做的。我認爲shell可以搜索輸入的字符串中的所有選項。示例
ls -a -l and ls -l -a
是相同的。也許會更好,如果你將搜索所有可能的選擇,或解釋所有字符一步一步。例如,首先搜索所有的「 - 」,之後它解釋的選項是「 - 」
'ls -a -l'和'ls -l -a'只是因爲'ls'處理它們是一樣的。它們當然與shell不一樣(即在第一種情況下它會將'ARGV'設置爲'{「ls」,「-a」,「-l」},而在第二種情況下則設爲'{「ls」 ,「-l」,「-a」} - shell不知道'ls'不關心選項的順序)。 – sepp2k 2011-06-11 01:34:35
它可能不是你想要做的方式,但是什麼讓你覺得strtok不行? – Duck 2011-06-11 01:13:19
@Duck因爲我將不得不使用空格作爲分隔符,並且在空格相鄰或右側空格處出現錯誤 – 2011-06-11 01:23:28
@Trevor Arjesk,您應該查看getopt,getopt_long等的源代碼。 – Duck 2011-06-11 01:50:42