Mehrere Befehle in einem Alias ​​für Bash

209

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

gnome-screensaver
gnome-screensaver-command --lock

Im Moment habe ich hinzugefügt

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

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

Yuriel
quelle

Antworten:

390

Versuchen:

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

oder

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

in Ihrem .bashrc

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

Mouviciel
quelle
7
sollte das nicht "function lock () {blah}" sein?
Smaragdjava
2
Wie geben Sie das Argument weiter? Das Verschachteln der Variablen 'msg' in lock()Klammern führt zu einem Fehler syntax error near unexpected token msg'` ..
Geotheory
8
Sobald die Funktion definiert wurde, verhält sie sich wie ein Befehl: Argumente befinden sich in der Befehlszeile, getrennt durch Leerzeichen. Auf dem Deklarationsteil Argumente sind $1, $2... in den Funktionskörpern.
Mouviciel
1
Downvote für das Nichteinschließen der Aliaszeile für mit Params.
Philip Rego
1
@PhilipRego - Ich würde mich freuen, von Ihnen zu lernen und Ihre Antwort zu bewerten.
Mouviciel
79

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

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

Jetzt wird der zweite Befehl erst ausgeführt, wenn der erste erfolgreich ist. Eine bessere Beschreibung der Kurzschlussbewertung wird in dieser SO-Frage beschrieben .

gpojd
quelle
5
Überraschenderweise habe git fetch && git pull origin masterich das &&mit versucht und habe nicht für mich gearbeitet, bis ich durch ersetzt habe ;.
Hakunin
3
Wahrscheinlich, weil Git Fetch etwas anderes als 0 zurückgegeben hat?
RobAu
Geholfen! Arbeit ist für mich am Xubuntu 16.04.3
Fernando León
Downvote für das Nichteinschließen der Aliaszeile für mit Params.
Philip Rego
18

Aliase sind für das Aliasing von Befehlsnamen gedacht . Alles darüber hinaus sollte mit Funktionen erledigt werden.

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

Aliase sind Namen, die noch mit dem ursprünglichen Namen verknüpft sind. llist nur eine etwas bestimmte 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 mit interner Logik. Es ist nicht einfach eine Umbenennung eines anderen Befehls. Es führt interne Operationen durch.

Technisch gesehen sind Aliase in der Bash-Shell-Sprache in ihren Funktionen so eingeschränkt, dass sie für alles, was mehr als einen einzelnen Befehl umfasst, äußerst schlecht geeignet sind . Verwenden Sie sie, um eine kleine Mutation eines einzelnen Befehls zu erstellen, nicht mehr.

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

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

Die Verwendung von Aliasen in einem solchen Szenario stößt auf viele Probleme. 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.

lhunath
quelle
Es wäre am besten, wenn Sie mit Ihrer Antwort ein Beispiel geben könnten. Warten auf Update.
Sajid Ali
1
Downvote für das Nichteinschließen der Aliaszeile für mit Params.
Philip Rego
2
@ PhilipRego-Aliase akzeptieren keine Parameter. Stimmen Sie den Apfel nicht ab, weil er nicht orange ist. Iss stattdessen eine Orange. Wie die Antwort sehr gut erklärt, ist das richtige Werkzeug hier nicht Aliase, sondern Funktionen.
lhunath
Ich meine solche Parameter. Ich habe verschachtelte Anführungszeichen falsch verwendet. alias = "git commit -m 'init'; git push; git status"
Philip Rego
@PhilipRego Sie müssen wirklich eine Funktion verwenden, keinen Alias. gps() { git commit -m 'init '; git push; git status; } Wie bereits erläutert, sind Aliase äußerst begrenzt, zerbrechlich und sollen nur Befehle umbenennen. Wenn Sie sie für nicht verwandte Zwecke missbrauchen, landen Sie in heißem Wasser, wie Sie es gerade erlebt haben.
lhunath
11

Funktioniert das nicht

alias whatever='gnome-screensaver ; gnome-screensaver-command --lock'
Sean Bright
quelle
4

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

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'
Adnan
quelle
1

Verwenden Sie also ein Semikolon:

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

Dies funktioniert nicht gut, wenn Sie dem ersten Befehl Argumente liefern möchten. Alternativ können Sie ein einfaches Skript in Ihrem Verzeichnis $ HOME / bin erstellen.

Jonathan Leffler
quelle
0

Wenn Sie meine 2 Cent zur 11 Jahre alten Diskussion hinzufügen, versuchen Sie Folgendes:

alias lock="gnome-screensaver \gnome-screensaver-command --lock"

Neenus
quelle
0

Fügen Sie diese Funktion zu Ihrem hinzu ~/.bashrcund starten Sie Ihr Terminal neu oder führen Sie es aussource ~/.bashrc

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

Auf diese Weise werden diese beiden Befehle bei jeder Eingabe ausgeführt lock Ihr Terminal .

In Ihrem speziellen Fall aliasfunktioniert das Erstellen eines möglicherweise, aber ich empfehle es nicht. Intuitiv würden wir denken, dass der Wert eines Alias ​​genauso ausgeführt wird, als ob Sie den Wert in das Terminal eingegeben hätten. Dies ist jedoch nicht der Fall:

Die Regeln für die Definition und Verwendung von Aliasen sind etwas verwirrend.

und

Für fast jeden Zweck werden Shell-Funktionen Aliasen vorgezogen.

Verwenden Sie also keinen Alias, es sei denn, Sie müssen. https://ss64.com/bash/alias.html

Philip Rego
quelle
-3

Ich bin auf ein Problem gestoßen, als ich Aliase deklariert habe ~/.bashrc. Mein Terminal hat die Aliase, in denen ich deklariert habe, nicht erkannt ~/.bashrc. Ich habe aus dem Artikel (unten angefügt) erfahren, dass Mac OS X login-shellstandardmäßig ausgeführt wird und daher ~/.bash_profilestatt aufgerufen wird ~/.bashrc.

Sollten Sie bei der Deklaration Ihrer Aliase auf dasselbe Problem stoßen, können Sie auf den folgenden Link verweisen, um das Problem zu lösen:

http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html

ToleLee
quelle
Bei dieser Qualitätssicherung geht es um mehrere Befehle in einem Alias, nicht darum , wo die Aliase abgelegt werden sollen.
Facuq
Ich führe immer source .bashrcnach dem Speichern von Änderungen an der Datei durch, damit der Alias ​​erkannt werden kann, ohne sich abzumelden.
Scott Fleming