Если вы посмотрите на его исходный код , вы увидите, что 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 уже есть тысячи подобных ограничений и особых случаев.