Wenn Sie sich den Quellcode ansehen , werden Sie sehen, shell-expand-line
dass er eigentlich heißen sollte 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;
Beachten Sie, dass dieser Kommentar weder Dateinamen noch Tilde-Erweiterung enthält. Es ist also im Grunde ein Zufall, dass es sogar für die erste Tilde funktioniert (Tilde hat sowieso nur am Anfang eines Wortes eine Bedeutung). Dies führt aber auch zu Prozessersetzungen, die ebenfalls nicht erwähnt werden. Das schwere Heben ist in der expand_word_internal
Funktion in der gleichen Datei.
Das rl_explicit_arg
im ersten Snippet bedeutet, dass, wenn Sie Esc-1 oder Alt-2 drücken, bevor die Tastenkombination gebunden ist shell-expand-line
, keine Anführungszeichen entfernt und kein Prozess / Befehl ersetzt wird. Ziemlich intuitiv, nicht wahr?
Sie können versuchen, einen Fehlerbericht einzureichen, aber es gibt wahrscheinlich bereits Tausende ähnlicher Einschränkungen und Sonderfälle wie diesen in bash.
echo *
nichts geändert wird, sondernecho $(echo *)
die Liste der Dateinamen im aktuellen Verzeichnis erweitert wird.