2012-04-27 114 views
1

好日子,C命令行界面 - 歷史之類的函數在BASH

我寫一個簡單的CLI(命令行界面)應用程序,它提供了一個簡單的提示,可以接受來自用戶的字符串,對它們進行驗證,並根據輸入執行某些操作。非常坦率的。

我在尋找一個獨立於平臺,非GPL/LGPL的手段(或者,至少是適用於POSIX兼容操作系統的東西,比如Linux,BSD等),所以我可以使用向上/向下箭頭鍵來在CLI應用程序中前後鍵入的命令的歷史記錄中來回滾動,並將它們顯示在輸入行中。

目標是有效地模仿BASH和其他大多數shell中的歷史功能。我想只使用上/下鍵並檢測它們。我假設我需要使用中斷或一些專門的庫,儘管如此,我真的很想只用標準的ANSI C做這件事,並且必須完全避免任何第三方庫。

+1

也許ncurses會以獨立於平臺的方式爲您完成大部分工作 – 2012-04-27 19:11:41

回答

7

如果你堅持自己做,那麼除了「自己動手」之外,我們沒有什麼可說的。這並不複雜,但也不是早晨的工作。

您應該認真考慮使用GNU readline,這是其他人(包括bash)所使用的。它做到了這一切,做得更好,並做得很好。

+1

Ps。錯誤的網址,請嘗試http://www.gnu.org/s/readline/ – Morpfh 2012-04-27 19:30:51

+0

@Rune - 謝謝!編輯。 – 2012-04-27 21:09:32

4

您可以使用bash使用的readline庫。請注意,這是GPL,因此您的代碼必須是內部或GPL。有libedit這是BSD許可具有較少的功能

1

正如其他答案所述,你真的應該使用readline。否則,您將不得不使用緩衝區,並使用read()的stdin文件描述符。您將需要設置包含您的歷史記錄的數據結構和/或文件。另外,您可以使用execvp()和/或system()來分派命令。

4

你可以使用readline,或者你可以採取簡單的路線,完全沒有。當你運行你的程序時,通過rlwrap調用它,你可以免費獲得歷史編輯。換句話說,而不是,:

$ mytool 

你只要運行

$ rlwrap mytool 

rlwrap周圍的ReadLine的包裝,讓您獲得的readline的好處,而不做任何工作。

+0

+1我不知道'rlwrap'。我使用了相同想法的Java版本。請注意,在Windows上,控制檯程序默認情況下會出現類似readline的行爲! – 2012-04-27 19:28:53