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
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.