Wie kann man Aliase inline in bash erweitern?

84

Gibt es eine Möglichkeit, Aliase in Bash inline zu erweitern?

$bash>alias ll='ls -l '
$bash>ll<tab>
$bash>ls -l 
asdfg
quelle

Antworten:

107

Sie können Ctrl- Alt- drücken e, um die Readline-Funktion auszuführen, die Alias- shell-expand-line, Verlaufs- und Worterweiterungen ausführt . Beachten Sie, dass dies bei einigen Tastaturen Metanicht der Fall ist Alt. Sie könnten drücken müssen , Escdann Ctrl-e

Die Funktionen alias-expand-lineund history-and-alias-expand-linesind nicht standardmäßig gebunden. Sie können sie jedoch binden, indem Sie Ihrer ~/.inputrcDatei Zeilen hinzufügen, die den folgenden ähneln .

"\e\C-l": alias-expand-line

was dazu führen würde, dass Ctrl- Alt- l(Kleinbuchstabe "ell") nur eine Alias-Erweiterung durchführt.

Dennis Williamson
quelle
Können wir die Alias-Erweiterung auf <tab> abbilden, ohne andere Bash-Abschlüsse zu beeinflussen?
asdfg
2
@asdfg: Wenn Sie dies tun, werden andere Abschlüsse unterbrochen. Es könnte funktionieren (ungetestet), die Map wie oben gezeigt zu erstellen und dann diese zusätzliche Map hinzuzufügen, um die vorhandene Map für Tab zu ersetzen. Dadurch "\C-i": "\e\C-l\e\e"wird ein Makro erstellt, das sowohl alias-expand-lineals auch ausführt complete. Es hängt von der Bindung aus meiner obigen Antwort ab und davon, dass die Standardbindung für Esc-Esc bestehen bleibt. Sie können weiterhin Esc-Esc ausführen, wenn Sie die Standardvervollständigung ausführen möchten.
Dennis Williamson
4
Funktioniert zwar ESC C-efür Bash, aber C-x afür Zsh. Auch unter OS X getestet.
Blaz
Wenn Sie einfach suchen Strg + etwas suchen, wo etwas das „x“ -Taste, können Sie es wie folgt in einigen Systemen tun: Control-x: history-and-alias-expand-line.
Igordcard
1
@WeijunZhou: Das hängt von Ihrem Fenstermanager und Ihren benutzerdefinierten Einstellungen ab. Für Gnome ist der Sperrbildschirm beispielsweise Super + L.
Dennis Williamson
2

Dies könnte tatsächlich eine viel einfachere Möglichkeit sein, das zu tun, was Sie versuchen ( bashVersion> = 4.2.29):

shopt -s direxpand
shopt -s expand_aliases

shopt‚s manSeite: https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

starscream_disco_party
quelle
3
Das ist falsch. Die Shell-Optionen "direxpand" und "expand_aliases" helfen nicht, die Aliase wie in der Frage angegeben inline zu erweitern. Ich weiß nicht, von welchem ​​Hut "direxpand" genommen wurde ...? Standardmäßig ist "expand_aliases" bereits festgelegt. Wenn Sie es deaktivieren, führt dies dazu, dass Aliase grundsätzlich deaktiviert werden (sie werden vor der Interpretation der Befehlszeile nicht erweitert). Zum Beispiel alias ll='ls -lwürde die Shell bei einem Alias 'll' als Befehl / Funktion 'll' interpretieren, was wahrscheinlich nicht existiert.
FooF
0

Das funktioniert nicht. Aber ich rate / hoffe, dass so etwas getan werden kann, um das zu tun, was Sie tun möchten. Sie müssten Ihr eigenes Abschlussskript verwenden. So machst du eins:

_ll()
{
     COMPREPLY=(ls -l)
     #The next line does not work. I just hope there were a way to replace that word
     COMP_WORDS[COMP_CWORD-1]="ls -l"
}
complete -F _ll ll

Geben Sie nun die vollständige Datei "bash_completion" ( http://caliban.org/bash ) ein und speichern Sie das oben genannte Skript in einer Datei im Verzeichnis "bash_completion.d", die Sie aus den URL-Referenzen erhalten. Lass es mich wissen, wenn es nicht funktioniert.

Vielen Dank.

0fnt
quelle
0

Für Leute, die zsh installiert haben und nach einer einfachen Lösung suchen, könnte globalias Ihr Freund sein

Erweitert alle Glob-Ausdrücke, Unterbefehle und Aliase (einschließlich global).

# .zsrc:
alias S="sudo systemctl"

$ S<space>
# expands to:
$ sudo systemctl

Zum Installieren fügen Sie einfach "globalias" zu Ihrer .zshrc-Plugin-Liste hinzu

plugins=(... globalias)

Drücken Sie dann einfach SPACE, um die Erweiterung eines von Ihnen geschriebenen Befehls auszulösen.

Wenn Sie nur ein Leerzeichen einfügen möchten, ohne die Befehlszeile zu erweitern, drücken Sie CTRL+SPACE

Kann
quelle