首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libreadline:何时调用函数"_rl_parse_colors()“?

libreadline:何时调用函数"_rl_parse_colors()“?
EN

Stack Overflow用户
提问于 2020-12-03 11:38:21
回答 1查看 63关注 0票数 0

我正在研究来自GNU储存库的Bash5.0。我想调试解析颜色的函数,所以我转到了颜色文件:

  1. bash-5.0/lib/readline/colors.c - 链接
  2. bash-5.0/lib/readline/parse-colors.c - 链接

我在函数_rl_parse_colors中添加了类似的打印

代码语言:javascript
复制
printf ("[*] INSIDE _rl_parse_colors");  

我几乎在任何函数中都这样做,但是在编译它之后,我运行了它,但是它没有打印我的调试打印:

代码语言:javascript
复制
root@ubuntu:~/Desktop/bash-5.0# ./bash -c 'echo -e "\033[31mHello\e[0m World"'
Hello World

我还尝试访问bash,然后运行它:

代码语言:javascript
复制
root@ubuntu:~/Desktop/bash-5.0# ./bash
root@ubuntu:~/Desktop/bash-5.0# echo $BASH_VERSION                                                         
5.0.0(8)-release
root@ubuntu:~/Desktop/bash-5.0# ./bash -c 'echo -e "\033[31mHello\e[0m World"'
Hello World

它用红色打印"Hello“,但不印我的指纹。

这与我使用echo有关吗?我不认为它会有什么影响,因为bash最终会封装命令的STDOUT,因此它应该用红色绘制字符串。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-03 12:40:21

找到密码(我在bash-5.1-testing分支) --

文件中的lib/readline/parse-colors.c

代码语言:javascript
复制
300 void _rl_parse_colors(void)
301 {
302 #if defined (COLOR_SUPPORT)
303   const char *p;                /* Pointer to character being parsed */
304   char *buf;                    /* color_buf buffer pointer */
305   int state;                    /* State of parser */
306   int ind_no;                   /* Indicator number */
307   char label[3];                /* Indicator label */
308   COLOR_EXT_TYPE *ext;          /* Extension we are working on */
309
310   p = sh_get_env_value ("LS_COLORS");
311   if (p == 0 || *p == '\0')
312     {
313       _rl_color_ext_list = NULL;
314       return;
315     }
...

在文件_rl_parse_colors()中只有一个lib/readline/readline.c调用

代码语言:javascript
复制
1215 /* Initialize the entire state of the world. */
1216 static void
1217 readline_initialize_everything (void)
1218 {
....
1287
1288 #if defined (COLOR_SUPPORT)
1289   if (_rl_colored_stats || _rl_colored_completion_prefix)
1290     _rl_parse_colors ();
1291 #endif
1292

vars将_rl_colored_stats_rl_colored_completion_prefix声音命名为这些读行设置:

代码语言:javascript
复制
[STEP 101] $ bind -v | grep color
set colored-completion-prefix off
set colored-stats off
[STEP 102] $

我刚刚验证了这些步骤是否会进入_rl_parse_colors()

  1. colored-completion-prefixcolored-stats中打开~/.inputrc
  2. 可选集(和导出) LS_COLORS
  3. 使用编译的bash ()启动一个交互式外壳程序(./bash)

根据bash手册(man bash):

colored-completion-prefix (Off) 如果设置为On,则在列表完成时,readline使用不同的颜色显示可能完成的集合的公共前缀。颜色定义取自LS_COLORS环境变量的值。colored-stats (Off) 如果设置为On,readline将使用不同的颜色显示可能的完成情况,以指示其文件类型。颜色定义取自LS_COLORS环境变量的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65125259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档