Bash: Leerzeichen im Aliasnamen

54067
sixtyfootersdude

Ich versuche in Ali ein Aliase zu erstellen. Was ich tun möchte, ist Karte ls -lazuls -la | more

In meiner .bashrc-Datei habe ich Folgendes versucht:

alias 'ls -la'='ls -la | more'

Es funktioniert jedoch nicht, weil (ich gehe davon aus) Leerzeichen im Aliasnamen enthalten. Gibt es dafür eine Umgehung?

100
Warum nicht `alias lsm = 'ls -la | mehr " Nifle vor 14 Jahren 8

4 Antworten auf die Frage

106
Dennis Williamson

In der Bash-Dokumentation heißt es: "Shell-Funktionen werden für fast jeden Zweck den Aliasnamen vorgezogen." Hier ist eine Shell-Funktion, die lsdie Ausgabe ersetzt und veranlasst, dass die Ausgabe weitergeleitet wird, morewenn das Argument (nur) besteht -la.

ls() { if [[ $@ == "-la" ]]; then command ls -la | more else command ls "$@" fi } 

Als Einliner:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; } 

Automatisch Pipe-Ausgabe:

ls -la 
Warum müssen Sie in der if-Anweisung doppelte Klammern verwenden? sixtyfootersdude vor 14 Jahren 1
@sixtyfootersdude: Die Doppelklammerform ist mächtiger und ich benutze sie aus Gewohnheit. Siehe http://mywiki.wooledge.org/BashFAQ/031 Dennis Williamson vor 14 Jahren 0
Was ist also der letzte Befehl? Alias ​​ls = 'ls ()'? Jeef vor 9 Jahren 0
@Jeef: Nein, meine Antwort verwendet eine Funktion * anstelle * eines Alias. Ich habe es editiert, um es klarer zu machen. Dennis Williamson vor 9 Jahren 1
Was ist hier der Befehl? Warum nicht einfach 'ls -la | more` oder `ls" $ @ "`? merlinpatt vor 8 Jahren 0
@merlinpatt: `command` verhindert, dass die Funktion rekursiv aufgerufen wird. Dennis Williamson vor 8 Jahren 6
Sehr nützlich, ich wollte ein Alias ​​verwenden, um git push durch ein Verhalten zu ersetzen, das sich ändert, wenn git push aus verschiedenen Verzeichnissen aufgerufen wird. Wenn Sie eine Funktion in .bash_aliases einfügen, ist sie in Ihrem Benutzerordner und -Unterordner genauso wie ein Alias ​​verwendbar. Simonlbc vor 8 Jahren 0
@Simonlbc: Beachten Sie, dass `.bash_aliases` höchstwahrscheinlich eher eine Distribution oder ein lokal definiertes Feature als ein Standard-Bash-Feature ist. Dennis Williamson vor 8 Jahren 0
@Simonlbc Anstatt das aktuelle Verhalten von git push zu ändern, würde ich vorschlagen, einen neuen [Git-Alias] (https://git-scm.com/book/tr/v2/Git-Basics-Git-Aliases) zu erstellen, z "git my-push". Franklin Yu vor 8 Jahren 0
@FranklinYu warum? Simonlbc vor 8 Jahren 0
@Simonlbc Um sicherzustellen, dass Online-Tutorials in meiner Umgebung sicher funktionieren. Vielleicht eher eine persönliche Entscheidung. Franklin Yu vor 8 Jahren 0
Achten Sie bei der Benennung der Funktion darauf, dass Sie nicht mit der `bash-completion'-Funktion (Befehl autocomplete) in Konflikt stehen. Ich habe ein bisschen Zeit damit verbracht, `tmux` zu beheben, nachdem ich die Funktion` _tmux` erstellt hatte, auf die der Befehl einen Alias ​​setzen sollte, aber ich entdeckte, dass `bash-completion` für` tmux` auch _tmux` verwendet hat, um die Autocomplete zu steuern. Also habe ich stattdessen die Funktion `_TMUX` erstellt. palswim vor 6 Jahren 0
46
heavyd

Aus der Alias-Manpage :

Wenn das erste Wort eines einfachen Befehls nicht in Anführungszeichen steht, wird geprüft, ob ein Alias ​​vorhanden ist. Wenn ja, wird dieses Wort durch den Text des Alias ​​ersetzt. Der Aliasname und der Ersetzungstext können eine beliebige gültige Shell-Eingabe enthalten, einschließlich Shell-Metazeichen, mit der Ausnahme, dass der Aliasname nicht '=' enthalten darf.

Daher wird nur das erste Wort auf Alias-Übereinstimmungen geprüft, was Mehrwort-Aliasnamen unmöglich macht. Möglicherweise können Sie ein Shell-Skript schreiben, das die Argumente prüft und Ihren Befehl auf Übereinstimmung prüft und ansonsten nur das Normal aufruft ls(siehe Antwort von @Dennis Williamson ).

+1 Um zu erklären, warum ich ls -la nicht als Alias ​​verwenden darf. sixtyfootersdude vor 14 Jahren 6
Dies war hilfreich, da es nicht versucht wurde, die Frage zu beantworten. Ich bin hierher gekommen, weil ich einen Alias ​​mit einem Leerzeichen erstellen wollte, und das passiert einfach nicht. angryundead vor 10 Jahren 6
13
ld_pvl

Ein etwas besserer Ansatz aus Dennis 'Antwort:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac } 

Oder der Einliner:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac } 

Auf diese Weise können bei Bedarf weitere Optionen / Argumente nach dem Befehl angefügt werden ls -la -h

Wie geht das, wenn ich möchte, dass "ls -lat" von dieser Behandlung ausgeschlossen wird? Ich müsste einen Fall über den Eintrag "-la *" stellen, ja? Steven Lu vor 10 Jahren 2
-2
Charles Stewart

Sie können diesen Alias ​​immer noch aufrufen, aber Sie benötigen ein Zitat, damit das Leerzeichen Teil des Befehlswortes ist. Also "ls -la" -p patternwird die -p patternOption an morenicht übergeben ls.