2015-11-02 76 views
1

對於編寫shell是一個相當新的嘗試,當我不給出任何額外的參數時,我試圖讓「cd」進入主目錄。chdir(getenv(「HOME」)提示錯誤「沒有這樣的文件或目錄」

但是,當我所謂的「CD」和代碼試圖chdir(getenv("HOME")),則顯示錯誤消息"No such file or directory"

/* 
    Builtin function implementations. 
*/ 
int cd(char **args){ 
    if (args[1] == NULL){ 
    printf("%s\n", getenv("HOME")); 
    if (chdir(getenv("HOME")) != 0) { 
     perror("dsh"); 
    } 
    } else if (chdir(args[1]) != 0){ 
    perror("dsh"); 
    } 
    return 1; 

} 

getenv("HOME")確實給正確的目錄,即"/Users/oasisweng"

我想我做了什麼不正確,我應該在哪裏修復?可能的,請告訴我爲什麼。

我已閱讀chdir人here但如果我手動輸入cd /Users/oasisweng,那麼它將工作。

謝謝!

+5

該代碼沒有問題。考慮發佈[MCVE](http://stackoverflow.com/help/mcve)。 – user3386109

+0

你的代碼是否有一個'chroot'調用? –

+0

什麼是'args'? –

回答

0

非常感謝您的幫助,當我找出答案時,我試圖遵循MCVE指南。因爲有人提出了我的問題,所以我覺得我應該分享我的答案。

我發現問題是我最初如何設置$HOME

所以基本上,我的shell讀$HOME$PATH變量在一個文件profile。它看起來像這樣:

PATH=/bin:/usr/bin:/usr/local/bin\n 
HOME=/Users/oasisweng\n 

我分割每行由=符號和setenv將保存到左邊的名稱右邊的值。

問題是setenv函數在調用時也會保存\n作爲$HOME的一部分!

cd(getenv("HOME"))實際上是cd("/Users/oasisweng\n")最後換行符。它失敗了,因爲它應該是cd("/Users/oasisweng")

我的解決辦法是setenv之前刪除換行符的右側的每個值:

int remove_newline(char* str){ 
    char* rst = strchr(str,'\n'); 
    if (rst != NULL){ 
    *rst = '\0'; 
    //found and changed 
    return 0; 
    } else{ 
    //not found 
    return 1; 
    } 
} 

轟!它正在運行。

本課非常簡單,但我認爲它仍然是一個有用的提醒。

+1

嗯......那麼,你是如何在你的'profile'文件中得到這些額外的'\ n'的?你是如何設法讓它們對'getenv'「可見的」?如果'profile'中的行以特定系統特定的EOL字符結束,它將不會成爲變量值的一部分,並且對'getenv'不可見。看來你的解決方案確實能夠治癒真正問題的症狀,而不是問題本身。 – AnT

+0

所以在我的情況下,'profile'是在崇高的文本中編輯的。我爲每一條新線都打了輸入按鈕。如何讓我的輸入按鈕進入系統特定的EOL字符? – donkey

+0

我想我的意思是我沒有用'shift + enter'輸入每一行,因爲我沒有用'.bash_profile'做例子。這是必要的嗎? – donkey

相關問題