为什么 GNU Readline 的 shell-expand-line 命令只展开第一个出现的波形符 (~)?

为什么 GNU Readline 的 shell-expand-line 命令只展开第一个出现的波形符 (~)?

根据 Bash 手册,shell-expand-lineGNU Readline 命令应该扩展命令行,就像 Bash 通常那样,包括别名和历史扩展。

当前设置可以通过以下方式查看bind -P | grep shell-expand-line

shell-expand-line can be found on "\e\C-e".

~我的问题是,在下面的示例中仅扩展了第一个波形符 ( ):

~/foo/bar ~/foo/baz

按“\e\Ce”后:

/Users/nlykkei/foo/bar ~/foo/baz

为什么?

答案1

如果你看看它的源代码,你会发现它shell-expand-line实际上应该被称为shell-expand-line-as-if-it-were-a-word

>> bashline.c
static int
shell_expand_line (count, ignore)
     int count, ignore;
{
     ...
      w->word = savestring (rl_line_buffer);
      w->flags = rl_explicit_arg ? (W_NOPROCSUB|W_NOCOMSUB) : 0;
      expanded_string = expand_word (w, rl_explicit_arg ? Q_HERE_DOCUMENT : 0);
>>> subst.c
/* Expand WORD, performing word splitting on the result.  This does
   parameter expansion, command substitution, arithmetic expansion,
   word splitting, and quote removal. */

WORD_LIST *
expand_word (word, quoted)
     WORD_DESC *word;
     int quoted;

请注意,该注释不包含文件名或波形符扩展。因此,即使对于第一个波形符它也有效(无论如何,波形符只在单词开头才有意义),这基本上是一个侥幸。但这也将进行流程替换,这也没有提及。繁重的工作是在expand_word_internal同一文件中的函数中。

第一个片段中的rl_explicit_arg表示如果您在绑定到 的组合键之前按 Esc-1 或 Alt-2 shell-expand-line,则不会删除引号将完成进程/命令替换。非常直观,不是吗?

您可以尝试提交错误报告,但 bash 中可能已经存在数千个类似的限制和特殊情况。

相关内容