2015-04-12 45 views
0

我正在寫一個shell腳本在C++中,我試圖編寫一種方法來做一些基本的單元測試,比較運行時產生的輸出系統和我的外殼差異。打開Shell程序,傳遞參數,並返回結果

基礎上,通過StackOverflow的文章很多讀書,這是我使用捕捉到一個簡單的ls命令的輸出內容:

FILE *syst; 
char buff[512]; 
string systout (""); 
if(!(syst = popen("ls ", "r"))){ 
    cout << "Failed! " << endl; 
    return 1; 
} 

while(fgets(buff, sizeof(buff), syst)!=NULL){ 
    systout.append(buff); 
} 

fflush(syst); 

pclose(syst); 

這一切正常。

問題是我無法找到一種方法讓我的shell腳本工作。 通常我運行它使用sudo ./shell,然後ls

這就是我現在所擁有的,但它不起作用。我認爲它沒有找到我的外殼或什麼,但沒有輸出。我知道shell是可以工作的,因爲我已經手動運行它,並且結果與預期的結果相匹配。

FILE *shel; 
char buff2[512]; 
string shelout (""); 
if(!(shel = popen("sudo ./shell ls ", "r"))){ 
    cout << "Failed! " << endl; 
    return 1; 
} 

while(fgets(buff2, sizeof(buff2), shel)!=NULL){ 
    shelout.append(buff2); 
} 

fflush(shel); 

pclose(shel); 

任何想法?

+1

「通常我用'sudo。/ shell'運行它,然後運行'ls'。」所以在我看來,這與運行'sudo ./shell ls'不是一回事。也許你想寫字符串'ls'到子進程的STDIN? –

+0

你應該用'sudo'運行你的程序,並且在不加前綴的情況下調用腳本,但這取決於你在做什麼。 –

回答

1

當你說「我通常運行它使用sudo ./shell,那麼LS」,你要說的是:

  1. 你執行「sudo」時,它傳遞一個參數「./shell」 。

  2. sudo運行「./shell」(作爲root用戶,但這裏沒有關係)。

  3. 「shell」可執行文件會提示輸入某種命令,輸入「ls」並獲得輸出結果。

您正嘗試通過下面的一段代碼來自動執行它:

popen("sudo ./shell ls ", "r") 

這樣做是

  1. 執行「命令」,並通過了「命令」命令2參數:「./shell」和「ls」。

這與第一部分第1步到第3步發生的情況完全不同;這就是爲什麼它不起作用。

要做的最簡單的事情就是修改「./shell」以支持將其作爲參數傳遞給命令的替代調用方式,而不是交互式地爲要執行的命令提供「./shell」提示。

0

您可以使用script命令捕獲您的輸入和輸出。 然後,您可以比較兩種情況下的輸出(使用diffcmp並使用簡單的程序過濾差異)。

相關問題