2012-12-07 41 views
0

我想使用bash的交互模式實現一個簡單的終端GUI。我成功地調用了bash,得到它的標準輸出,並將所有內容打印到文本視圖中。我將文本視圖中的用戶輸入轉發給bash的stdin,以便能夠運行命令。它工作得很好,除非我沒有收到任何錯誤消息。防止bash轉發標準輸入到標準錯誤

但是,當我繼續在我的文本視圖中打印bash的stderr時,我注意到一些奇怪的東西。除了現在接收到錯誤消息之外,bash似乎通過了從stdinstderr的所有內容。因此,我輸入的每個字符都會打印兩次(一次正常是因爲我輸入了它,一次是因爲我打印的所有內容都從stderr)。

它似乎也打印提示通過stderrbash-3.2$)。這是預期的行爲?這可以抑制嗎?

我也嘗試只捕獲使用輸入(而不是讓用戶直接輸入文本視圖)並依靠bash打印用戶輸入。這是通過標準輸出標準錯誤差不多的工作,除了輸出的順序是隨機的:

如果我喜歡echo test鍵入命令並回車,有時我得到這個:
(第二test是輸出,我沒有鍵入testtest

bash-3.2$ echo testtest 
bash-3.2$ 

有時候我:

bash-3.2$ echo test 
bash-3.2$ test 

我收到最後的\n,輸出和下一個bash-3.2$的順序顯然是混合起來的。

+0

我不知道答案,但讓我想起舊的DOS'@echo off' – Madbreaks

+0

你是如何調用bash的?我不確定你實際執行的是什麼。 – Michael

+0

它看起來像緩衝問題給我。 'bash'對stderr執行stdin迴應,以便標準終端模擬器上的用戶可以看到他在輸入什麼內容。你可能會在stdout和stderr上得到一些奇怪的緩衝,這會阻止你在bash中發送字符時立即讀取字符。但是......我不知道Objective-C,所以我不能幫助你。 – liori

回答

2

無法以「正確」順序讀取stdout和stderr,因爲在不同管道之間沒有順序的概念。但是可以確保兩者都發送到相同的管道(即相同的文件描述符),而不是將每個管道都轉到單獨的管道。要做到這一點,請查看用於啓動bash子進程的選項;或者可能啓動一個命令行如bash -c 'bash 2>&1'

+0

爲什麼我沒有想到這個?...非常感謝,這似乎工作。 – DrummerB

相關問題