292 Stimmen

Mehrere Befehle in einem Alias für bash

Ich möchte einen Alias definieren, der die folgenden zwei Befehle nacheinander ausführt.

gnome-screensaver
gnome-screensaver-command --lock

Im Moment habe ich Folgendes hinzugefügt

alias lock='gnome-screensaver-command --lock'

zu meiner .bashrc hinzufügen, aber da ich meine Workstation so oft sperre, wäre es einfacher, nur einen Befehl einzugeben.

1 Stimmen

Für den Fall, dass jemand die .bashrc Datei in W10: stackoverflow.com/a/68745805/7389293

515voto

mouviciel Punkte 64583

Versuchen Sie es:

alias lock='gnome-screensaver; gnome-screensaver-command --lock'

o

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

in Ihrer .bashrc

Bei der zweiten Lösung können Sie Argumente verwenden.

7 Stimmen

Müsste das nicht heißen: "function lock() { blah }"?

2 Stimmen

Wie kann man das Argument weitergeben? Verschachtelung der Variablen 'msg' innerhalb lock() Klammerung ergibt Fehler syntax error near unexpected token msg'`..

11 Stimmen

Sobald die Funktion definiert ist, verhält sie sich wie ein Befehl: Argumente stehen in der Befehlszeile, getrennt durch Leerzeichen. Im Deklarationsteil sind die Argumente $1 , $2 ... im Funktionskörper.

112voto

gpojd Punkte 21504

Die anderen Antworten beantworten die Frage angemessen, aber Ihr Beispiel sieht so aus, als ob der zweite Befehl davon abhängt, dass der erste Befehl erfolgreich beendet wird. Sie könnten versuchen, einen Kurzschlussauswertung in Ihrem Alias:

alias lock='gnome-screensaver && gnome-screensaver-command --lock'

Jetzt wird der zweite Befehl nicht einmal versucht, wenn der erste nicht erfolgreich ist. Eine bessere Beschreibung der Kurzschlussauswertung findet sich in diesem SO Frage .

8 Stimmen

Überraschenderweise habe ich das mit git fetch && git pull origin master und funktionierte bei mir nicht, bis ich die && con ; .

7 Stimmen

Wahrscheinlich weil git fetch etwas anderes als 0 zurückgegeben hat?

0 Stimmen

Geholfen! Funktioniert bei mir auf Xubuntu 16.04.3

30voto

lhunath Punkte 111281

Aliase sind gedacht für Aliasing Befehlsnamen. Alles, was darüber hinausgeht, sollte mit Funktionen erledigt werden.

alias ll='ls -l' # The ll command is an alias for ls -l

Aliasnamen sind Namen, die noch mit dem ursprünglichen Namen verbunden sind. ll ist nur eine etwas spezielle Art von ls .

d() {
    if exists colordiff; then
        colordiff -ur "$@"
    elif exists diff; then
        diff -ur "$@"
    elif exists comm; then
        comm -3 "$1" "$2"
    fi | less
}

Eine Funktion ist ein neuer Befehl, der über eine interne Logik verfügt. Sie ist nicht einfach eine Umbenennung eines anderen Befehls. Sie führt interne Operationen aus.

Technisch gesehen sind Aliase in der Shell-Sprache Bash in ihren Möglichkeiten so begrenzt, dass sie für alles, was mehr als ein einziger Befehl . Verwenden Sie sie für eine kleine Mutation eines einzelnen Befehls, nicht mehr.

Da die Absicht darin besteht, einen neuen Befehl zu erstellen, der eine Operation ausführt, die intern in anderen Befehlen aufgelöst wird, ist die einzig richtige Antwort, hier eine Funktion zu verwenden:

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

Die Verwendung von Aliasen in einem Szenario wie diesem führt zu einer Reihe von Problemen. Im Gegensatz zu Funktionen, die als Befehle ausgeführt werden, werden Aliase in den aktuellen Befehl erweitert, was zu sehr unerwarteten Problemen führt, wenn dieser Alias "Befehl" mit anderen Befehlen kombiniert wird. Sie funktionieren auch nicht in Skripten.

0 Stimmen

Am besten wäre es, wenn Sie Ihrer Antwort ein Beispiel beifügen könnten. Ich warte auf ein Update.

1 Stimmen

Downvote für die fehlende Alias-Zeile für with params.

3 Stimmen

@PhilipRego aliases nehmen keine Parameter an. Kritisiere den Apfel nicht, weil er nicht orange ist. Essen Sie stattdessen eine Orange. Wie die Antwort sehr gut erklärt, ist das richtige Werkzeug hier nicht Aliase, sondern Funktionen.

13voto

Sean Bright Punkte 114347

Funktioniert das nicht?

alias whatever='gnome-screensaver ; gnome-screensaver-command --lock'

6voto

Adnan Punkte 2919

Dies würde die 2 Befehle nacheinander ausführen:

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X