Gemäß dem Bash-Handbuch shell-expand-line
sollte der Befehl GNU Readline die Befehlszeile erweitern, so wie es Bash normalerweise tun würde, einschließlich Alias- und Verlaufserweiterung.
Die aktuelle Einstellung kann angezeigt werden mit bind -P | grep shell-expand-line
:
shell-expand-line can be found on "\e\C-e".
Mein Problem ist, dass ~
im folgenden Beispiel nur die erste tilde ( ) erweitert wird:
~/foo/bar ~/foo/baz
Nach dem Drücken von "\ e \ Ce":
/Users/nlykkei/foo/bar ~/foo/baz
Warum?
echo *
nichts geändert wird, sondernecho $(echo *)
die Liste der Dateinamen im aktuellen Verzeichnis erweitert wird.Antworten:
Wenn Sie sich den Quellcode ansehen , werden Sie sehen,
shell-expand-line
dass er eigentlich heißen sollteshell-expand-line-as-if-it-were-a-word
: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 istshell-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.
quelle
(bar=*; echo $bar)
oder einfachecho *
.apt-get source pkg-name
.