根据 Bash 手册,shell-expand-line
GNU 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 中可能已经存在数千个类似的限制和特殊情况。