2012-11-19 82 views
0

我在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中,因爲它有很多,根據我的經驗,當我用代碼填滿幾頁時,人們不喜歡它。

+0

我接過一看代碼,它太大了鼓勵審查。您可能不會在某個參數列表的末尾添加空指針。您應該嘗試一些在內部回顯命令中回顯多個參數的替代序列。我將推薦一些通用調試技術。一種可能性是簡單地在調試器下運行代碼。我傾向於使用較舊的學校的「插入打印語句」技術。我會將打印語句添加到可以檢測添加額外參數的位置,或者未設置NULL指針。祝你好運。 –

+0

我認爲自從我發佈這個以來,我已經指出了這一點。當我執行exec(「echo」)時,我期望它在輸出後插入一個空字符。如何在回聲停止寫入的地方寫入單個空字符?我認爲這會解決我的整個問題。謝謝。 –

回答

1

你的問題在於expCmdOutput。正如您已經注意到的那樣,使用read讀取子進程的輸出時,不會得到NUL終止的字符串。你想要做的是手動終止字符串,通過你的行調用read 29(expand.c)後,添加類似

buf[bytes_read] = '\0'; 

。 Sicne你需要爲NUL空間,你只能讀取多達BUF_SIZE - 1字節,然後,當然。

你或許應該重新考慮整個循環你這樣做以後,雖然:

/* READ OUTPUT OF COMMAND FROM READ END OF PIPE, THEN CLOSE READ END */ 
    bytes_read = read(fd[0],buf,BUF_SIZE); 
    while(bytes_read > 0) 
    { 
      bytes_read = read(fd[0], buf, BUF_SIZE); 
      if (bytes_read == -1) perror("read"); 
    } 
    close(fd[0]); 

如果你的命令的輸出比BUF_SIZE時間越長,你只需再次讀buf,覆蓋你剛纔讀的輸出。你真正想要的是分配內存並使用strcat(或者通過在指定字符串的末尾保存效率指針)追加到最後。