我想使用bash的交互模式實現一個簡單的終端GUI。我成功地調用了bash,得到它的標準輸出,並將所有內容打印到文本視圖中。我將文本視圖中的用戶輸入轉發給bash的stdin,以便能夠運行命令。它工作得很好,除非我沒有收到任何錯誤消息。防止bash轉發標準輸入到標準錯誤
但是,當我繼續在我的文本視圖中打印bash的stderr時,我注意到一些奇怪的東西。除了現在接收到錯誤消息之外,bash似乎通過了從stdin到stderr的所有內容。因此,我輸入的每個字符都會打印兩次(一次正常是因爲我輸入了它,一次是因爲我打印的所有內容都從stderr)。
它似乎也打印提示通過stderr(bash-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$
的順序顯然是混合起來的。
我不知道答案,但讓我想起舊的DOS'@echo off' – Madbreaks
你是如何調用bash的?我不確定你實際執行的是什麼。 – Michael
它看起來像緩衝問題給我。 'bash'對stderr執行stdin迴應,以便標準終端模擬器上的用戶可以看到他在輸入什麼內容。你可能會在stdout和stderr上得到一些奇怪的緩衝,這會阻止你在bash中發送字符時立即讀取字符。但是......我不知道Objective-C,所以我不能幫助你。 – liori