mehrere Befehle in einem Alias ​​für bash


133

würde Ich mag einen Aliasnamen definieren, die die folgenden zwei Befehle nacheinander ausgeführt wird.

gnome-screensaver 
gnome-screensaver-command --lock 

Gerade jetzt habe ich

hinzugefügt
alias lock='gnome-screensaver-command --lock' 

meine Bashrc aber da ich meine Arbeitsstation sperren, so oft wäre es einfacher, nur einen Befehl eingeben.

260

Versuchen:

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

oder

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

in .bashrc

Die zweite Lösung ermöglicht es Ihnen, Argumente zu verwenden.

+5

sollte das nicht sein „Funktionssperre() {} blah“ ? 14 jan. 102010-01-14 12:12:53

+7

Ich benutze 'sh' Syntax, die auch mit' bash' funktioniert. 14 jan. 102010-01-14 13:54:55

+2

Wie geht man das Argument? Verschachtelungsvariable 'msg' in 'lock()' Klammern gibt Fehler 'syntax error nahe dem unerwarteten Token' msg''. 25 mär. 142014-03-25 14:57:54

+6

Sobald die Funktion definiert wurde, verhält sie sich wie ein Befehl: Argumente befinden sich auf der Kommandozeile, getrennt durch Leerzeichen . Auf dem Deklarationsteil sind Argumente '$ 1', '$ 2' ... im Funktionskörper. 25 mär. 142014-03-25 15:17:23

  0

danke für die Erwähnung der Multi-Line-Funktion 13 jul. 142014-07-13 07:58:30


11

Funktioniert das nicht?

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

4

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

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

2

So ein Semikolon verwenden:

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

Dieses gut funktioniert nicht, wenn Sie Argumente liefern wollen zum ersten Befehl. Alternativ erstellen Sie ein triviales Skript in Ihrem $ HOME/bin-Verzeichnis.


9

Aliases für Aliasing Befehlsnamen gemeint. 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 immer noch mit dem ursprünglichen Namen verknüpft sind. ll ist nur eine etwas spezifische Art von ls.

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

Eine Funktion ist ein neuer Befehl, der interne Logik aufweist. Es ist nicht einfach eine Umbenennung eines anderen Befehls. Es führt interne Operationen durch.

Technisch sind Aliase in der Bash-Shell-Sprache so begrenzt in Fähigkeiten, dass sie extrem schlecht geeignet sind für alles, was mehr als ein einziges Kommando betrifft. Benutze sie, um eine kleine Mutation eines einzelnen Befehls zu machen, nicht mehr.

Da die Absicht ist, einen neuen Befehl zu erstellen, die eine Operation durchführt, die intern in anderen Befehlen lösen werden, die einzig richtige Antwort ist hier eine Funktion zu verwenden:

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

Verwendung von Alias-Namen in einem Szenario wie Dies führt zu vielen 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 arbeiten auch nicht in Skripten.

  0

Es wäre am besten, wenn Sie ein Beispiel mit Ihrer Antwort geben könnten. Warten auf Update. 15 nov. 172017-11-15 14:40:00


56

Die anderen Antworten beantworten die Frage angemessen, aber Ihr Beispiel sieht aus wie der zweite Befehl hängt davon ab, dass der erste erfolgreich beendet wird. Sie können eine short-circuit evaluation in Ihrem Alias ​​versuchen wollen:

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

Nun wird der zweite Befehl wird nicht einmal versucht werden, es sei denn, der erste erfolgreich ist. Eine bessere Beschreibung der Kurzschlussauswertung ist in dieser SO question beschrieben.

+4

Überraschenderweise versuchte ich dies mit 'git fetch && git pull origin master' und funktionierte nicht für mich, bis ich' && 'durch'; 'ersetzt habe. 25 feb. 142014-02-25 09:42:00

+3

Wahrscheinlich, weil git fetch etwas anderes als 0 zurückgegeben hat? 12 feb. 152015-02-12 09:53:14

  0

geholfen! Arbeit ist für mich auf Xubuntu 16.04.3 09 jan. 182018-01-09 12:16:54


0

Ich kam zu einem Problem beim Deklarieren von Aliasen in ~/.bashrc. Mein Terminal hat die Aliase, die ich in ~/.bashrc deklariert habe, nicht erkannt. Ich habe aus dem Artikel (unten anbei) gelernt, dass Mac OS X standardmäßig login-shell ausführt und daher ~/.bash_profile statt ~/.bashrc aufruft.

Sollten Sie kommen in das gleiche Problem Ihre Aliase in deklarieren, können Sie auf den folgenden Link beziehen sich auf das Problem zu lösen:

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