如何在独立的shell程序中实现previous-command-scroll?

时间:2014-09-03 15:17:37

标签: c linux

对于一个类项目,我们必须实现一个基本的Linux shell。就目前而言,除了“UP”键之前的命令滚动功能外,我还有一切工作要完全实现基本功能。

这样的事情怎么可能实施?我意识到它可能就像在输入字符串中保留char*数组一样简单,但我们如何捕获“UP”按键按下?

一旦我们实现了上述功能,如何在不使其成为永久性的情况下写入stdout?也就是说,当你再次按下“UP”时,它会删除之前用另一个命令写的内容。

2 个答案:

答案 0 :(得分:2)

实现 up 键的一种实用方法是使用GNU readline库(及其history子库)。顺便说一句,有些shell确实使用GNU readline(它是在GPL许可下)。而且你也会得到行版。您可以使用选项卡键等实现完成。

还有其他方法,例如使用ncursestermcap等...或在原始终端上发出ANSI escape codes。另见the tty demystified& termios(3) ...

BTW,大多数Linux shell都是free software,所以你可以研究它们的源代码。

答案 1 :(得分:1)

如果你直接从STDIN使用非缓冲的逐字符输入(这意味着,除了其他方面,控制字符,如CTRL + C不会自动处理),那么你将逐字节读取。与ASCII符号不同,箭头键在STDIN上放置了多个字节,因为它们是excape sequences。这些字节因系统而异。确定系统转义序列的最简单方法是执行不带参数的cat命令,然后按箭头键。将显示类似^[[A的内容,您需要将该序列从ASCII转换为十六进制字节。

完成上述操作后,您可以使用get_char()逐个读取一个字节,就像您可能已经在输入功能中一样。