我在C寫了一個unix minishell,並且正在添加命令擴展的位置。我的意思是,我可以在其他命令窩命令,例如:C Minishell命令擴展打印亂碼
$> echo hello $(echo world! ... $(echo and stuff))
hello world! ... and stuff
我想我有它的工作主要是,但是它沒有標記擴展字符串的結尾正確,例如,如果我做的:
$> echo a $(echo b $(echo c))
a b c
$> echo d $(echo e)
d e c
看到它打印C,儘管我並沒有要求它。這裏是我的代碼:
msh.c - http://pastebin.com/sd6DZYwB expand.c - http://pastebin.com/uLqvFGPw
我有更多的代碼,但是有很多的它,這些都是我在與麻煩的部分此時此刻。我會盡力告訴你我正在做這件事的基本方式。
Main在msh.c中,它從命令行或shellfile獲取一行輸入,然後調用processline(char * line,int outFD,int waitFlag),其中line是我們剛剛獲得的行,outFD是輸出文件的文件描述符,waitFlag告訴我們是否應該等待分叉。當我們把這種從主,我們像這樣做:
processline (buffer, 1, 1);
在ProcessLine從我們分配一個新行:
char expanded_line[EXPANDEDLEN];
然後調用擴大,expand.c:
expand(line, expanded_line, EXPANDEDLEN);
在擴大,我們從字面上行復制的字符expanded_line,直到我們找到一個$(,然後調用:
static int expCmdOutput(char *orig, char *new, int *oldl_ind, int *newl_ind)
orig是行,並且新行是擴展行。 oldl_ind和newl_ind分別是行和擴展行中的當前位置。然後,我們管道,遞歸地調用processline,傳遞嵌套的命令(例如,如果我們有「echo $(echo b)」,我們會傳遞流程線「echo b」)。
這是我感到困惑的地方,每次調用擴展時,它都會分配一個新的內存塊EXPANDEDLEN long?如果是這樣,這很糟糕,因爲我很快就會耗盡堆棧空間(在命令行輸入嵌套很大的情況下)。在expand中,我在擴展字符串的末尾插入一個空字符,那麼爲什麼它會打印過去呢?
如果你們需要更多的代碼,或解釋,只是問。其次,我把代碼放在pastebin中,因爲它有很多,根據我的經驗,當我用代碼填滿幾頁時,人們不喜歡它。
我接過一看代碼,它太大了鼓勵審查。您可能不會在某個參數列表的末尾添加空指針。您應該嘗試一些在內部回顯命令中回顯多個參數的替代序列。我將推薦一些通用調試技術。一種可能性是簡單地在調試器下運行代碼。我傾向於使用較舊的學校的「插入打印語句」技術。我會將打印語句添加到可以檢測添加額外參數的位置,或者未設置NULL指針。祝你好運。 –
我認爲自從我發佈這個以來,我已經指出了這一點。當我執行exec(「echo」)時,我期望它在輸出後插入一個空字符。如何在回聲停止寫入的地方寫入單個空字符?我認爲這會解決我的整個問題。謝謝。 –