免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3078 | 回复: 9
打印 上一主题 下一主题

[C] shell功能追加 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-28 09:00 |只看该作者 |倒序浏览
现在因为项目需要,需要自己改造一下shell

源码在这里:
  1. http://www.unf.edu/public/cop6611/rbutler/LAD/ladsh4.c
复制代码
我选了这个shell,但是没有

1:tab自动命令补充功能;
2:↑ ↓箭头,没有履历功能;
3:bs箭头无效。


三个功能

现在想要添加这三个功能,但是无从下手,望有经验的各位,给点思路。

谢谢



论坛徽章:
0
2 [报告]
发表于 2012-10-01 09:16 |只看该作者
看来大家都放假了。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
3 [报告]
发表于 2012-10-01 09:29 |只看该作者
用readline或者linenoise,替换掉getCommand函数。

论坛徽章:
0
4 [报告]
发表于 2012-10-01 09:52 |只看该作者
starwing83 发表于 2012-10-01 09:29
用readline或者linenoise,替换掉getCommand函数。



C初级水平,能否详细点?
谢谢。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
5 [报告]
发表于 2012-10-01 11:00 |只看该作者
回复 4# yjchlove


    关键词都给你了,不会自己百度么?

而且这两个库提供的函数接口都是非常少的。libreadline只提供了一个readline函数,而linenoise也只提供了一个linenoise函数而已,自己看说明都不会么~

论坛徽章:
0
6 [报告]
发表于 2012-10-01 11:11 |只看该作者
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. //#include "/usr/include/readline/readline.h"
  4. //#include "/usr/include/readline/history.h"
  5. #include <readline/history.h>
  6. #include <readline/readline.h>

  7. #define MAX_HISTORY_NO 3

  8. int
  9. main(void)
  10. {
  11.   char *prompt = getenv("PS2");
  12.   char *line = NULL;
  13.   int lineSize = 0;
  14.   int index = 0;
  15.   int history_no = 0;
  16.   HIST_ENTRY *history = NULL;
  17. #if 0
  18.   // readline呼び出し
  19.   while (line = readline(prompt)) {
  20.     lineSize = strlen(line);
  21.     for (index = lineSize - 1; index >= 0; index--) {
  22.       printf("%c", line[index]);
  23.     }
  24.     printf("\n");

  25.     add_history(line);

  26.     if (++history_no > MAX_HISTORY_NO) {
  27.       history = remove_history(0);
  28.       free(history);
  29.     }

  30.     // 入力文字列領域開放
  31.     free(line);
  32.   }
  33.   printf("\n");

  34.   clear_history();
  35. #endif
  36.   line = readline(prompt);
  37.   printf(" last input = [ %s ]\n", line);
  38.   free(line);

  39.   return EXIT_SUCCESS;
  40. }
复制代码
  1. sgq@sgq-PC-MY28VCZEE:~$ dpkg -l | grep readline
  2. ii  lib64readline-gplv2-dev                5.2-11                                  GNU readline and history libraries, development files (64-bit)
  3. ii  lib64readline5                         5.2-11                                  GNU readline and history libraries, run-time libraries (64-bit)
  4. ii  libreadline5                           5.2-11                                  GNU readline and history libraries, run-time libraries
  5. ii  libreadline6                           6.2-8                                   GNU readline and history libraries, run-time libraries
  6. ii  libreadline6-dev                       6.2-8                                   GNU readline and history libraries, development files
  7. ii  readline-common                        6.2-8                                   GNU readline and history libraries, common files
  8. sgq@sgq-PC-MY28VCZEE:~$
复制代码
  1. sgq@sgq-PC-MY28VCZEE:~$ gcc readline.c -o readline
  2. /tmp/ccwKd71P.o: In function `main':
  3. readline.c:(.text+0x49): undefined reference to `readline'
  4. collect2: ld returned 1 exit status
  5. sgq@sgq-PC-MY28VCZEE:~$
复制代码
编译不通过。还缺什么么?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
7 [报告]
发表于 2012-10-01 11:21 |只看该作者
你用一个库,肯定是需要链接的啊,C标准库是默认自带,但是其他的库你得在命令行链接吧?

gcc readline.c -o readline -lreadline

这个库的名字叫libreadline,它的库在/lib/libreadline.a,根据gcc的规则,应该提供-lreadline参数gcc才能找到这个库提供的符号。

论坛徽章:
0
8 [报告]
发表于 2012-10-02 14:14 |只看该作者
感谢楼上的兄弟,我的问题已经解决。





顺便再问一个问题。用了标准的readline函数,自带了tab补充功能,
但是出来的都是自己当前的文件名。
怎么能够改变这个目录?

论坛徽章:
0
9 [报告]
发表于 2012-10-02 14:45 |只看该作者
readline的授权是GPL,使用GPL的库会要求你整个项目的代码授权采用GPL,CLISP就是其中的例子。

还是用linenoise或者libedit吧,开源库是不能随便用的。

论坛徽章:
0
10 [报告]
发表于 2012-10-03 09:11 |只看该作者
授权,就不管我的事情了。
我的职责是解决问题。专门有人负责这个。真的不能用,我在重新提案新的lib


顺便再问下,这个可以解决么?
  1. 顺便再问一个问题。用了标准的readline函数,自带了tab补充功能,
  2. 但是出来的都是自己当前的文件名。
  3. 怎么能够改变这个目录?
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP