Ist es möglich, einen Befehl in Bash zu definieren?

25

Kann ich zum Beispiel Folgendes einstellen:

gb = cd /media/Dan/evolution

... damit ich jedes Mal, wenn ich gbin bash ausführe , cdzu diesem bestimmten Verzeichnis wechseln kann ?

Ich habe online etwas gefunden: den aliasBefehl. Aber es scheint, dass es die Arbeit oben nicht tun kann.

Ist es möglich, es zu tun? Wie?

Zen
quelle
10
alias gb='cd /media/Dan/evolution'
Nykakin
4
@ Zen, bitte akzeptieren Sie die Antwort, wenn das Problem dadurch behoben wird. Dies ist eine Geste des Dankes an den Benutzer, der Ihnen bei der Lösung des Problems geholfen hat :)
Ramesh
2
Hinweis: Hier geht es um Bash: Linux ist ein Kernel. Linux wird oft fälschlicherweise verwendet, um auf das gesamte Betriebssystem zu verweisen. Dies kann zu Verwirrung führen. Zum Beispiel lautet die Frage: "Kann ich so oder so etwas unter Linux machen?", Wenn Sie es auf einem Computer machen können, dann ja. Weil Sie mit einem Linux-Kernel jedes beliebige Betriebssystem implementieren können. Also müssen wir wissen, welches, Sie verwenden Ubuntu Gnu + Linux + wahrscheinlich X11 (wenn auf einem Desktop, dh nicht einem Server ohne Display).
Strg-Alt-Delor
@richard Guter Punkt, obwohl dies technisch eine posixBeschwerde ist, also nicht nur bash.
1
@richard Ja, das ist das Problem. Es funktioniert, da die Leute nicht mehr oder weniger Android und solche Aromen meinen. Ich sage nicht, dass es eine gute Sache ist, aber es ist, was es ist. Meine Empfehlung war implizit, da ich Ihre Linux-Anweisung kommentiert habe. Ich habe mich nur klar ausgedrückt, da das Thema der verwirrende Begriff war. (Ich könnte Ihren letzten Kommentar falsch verstanden haben)
Keyser

Antworten:

50

Tipp einfach:

alias gb='cd /media/Dan/evolution'

Um diese Einstellung dauerhaft zu machen (damit sie nach dem Neustart oder Öffnen einer anderen Konsole nicht verändert wird), fügen Sie diese Zeile der Datei ~ / .bashrc hinzu (vorausgesetzt, Sie verwenden die Bash als Standard-Shell).

schrobe
quelle
Um es noch schöner zu machen, können Sie eine dedizierte Alias-Datei für Ihre Aliasse erstellen, z. B. ~ / .bash_aliases, und diese in Ihrer ~ / .bashrc-Datei folgendermaßen aufrufen: [-e ~ / .bash_aliases] &&. ~ / .bash_aliases Auf diese Weise "verschmutzen" Sie die ~ / .bashrc-Datei nicht mit anderen Dingen.
GeertVc
39

Alternative zum Aliasing

gb() { cd /media/Dan/evolution; }

Dies definiert die Shell-Funktion gb, die keine Argumente akzeptiert und cd / media / Dan / evolution ausführt. Wie bei anderen Vorschlägen kann dies zu ~ / .bashrc hinzugefügt werden

user1207217
quelle
Mit dem Nachteil, dass der Alias-Befehl den definierten Alias ​​anzeigt, kann die Definition einer solchen Funktion zu "unerwartetem Verhalten" führen. Ich werde dich der Vollständigkeit zuliebe wählen :)
vfbsilva
7
Nicht wirklich. Sie können einfach Folgendes eingeben: declare -f gb, um zu sehen, was es tut
Paul Calabro
11
Diese Option ist auch flexibler, da Sie Ihre benutzerdefinierte Logik in die Funktionsdefinition einfügen können, um Argumente zu akzeptieren und alles zu tun, was Sie benötigen. Aliase erlauben nur das Übergeben von Argumenten und das Ausführen vordefinierter Aktionen .
Paul Calabro
5
@PaulCalabro Noch besser, type gbfunktioniert, wenn es sich um einen Alias oder eine Funktion handelt.
Sparhawk
POSIXLY: { echo 'true() { : ; }' >./script ; . ./script ; command -V true ; command -V /usr/bin/true ; }- true is a shell function\n/usr/bin/true is /usr/bin/true- Die \nZeichen waren wörtliche Zeilenumbrüche in der Ausgabe.
MikeServ
11

Es ist möglich und aliasist der Befehl, den Sie suchen. Zum Beispiel alias ll="ls -l"in Bash können Sie llanstelle von eingeben ls -l. Bitte beachten Sie, dass beim Festlegen eines Alias ​​keine Leerzeichen verwendet werden. man aliaskann auch nützlich sein.

schaiba
quelle
-3

Alternativ ist es möglich, ein C-Programm zu schreiben, das den gewünschten Befehl aufruft, und ihn in / usr / bin zu speichern.

#include <stdio.h>
#include <string.h>

int main () {
    char command[50]; //notice you can change this to fit your needs
    int return_val;

    strcpy( command, "echo \"cd /media/Dan/evolution\" | bash -i" );
    return_val = system(command); 

   //this is equivalent to entering the command in a new bash, 
   //which will return and exit

    return return_val;
}

Wechseln Sie zum Kompilieren in das Verzeichnis, in dem die Quelle gespeichert wurde (in Bash), und führen Sie Folgendes aus (möglicherweise benötigen Sie sudo):

 gcc ./gb.c -o /usr/bin/gb

Nachdem ich hier weiter recherchiert hatte , wurde mir klar, dass das einfache Einwerfen Ihres Befehls system()für eingebaute Bash-Befehle nicht funktioniert. Aus diesem Grund müssen Sie eine Instanz einer interaktiven Bash erstellen und Ihre Befehle an sie senden. Es ist einfach zu kompliziert und wahrscheinlich nutzlos, es sei denn, Sie möchten beispielsweise einen Aufruf eines Shell-Skripts ( some_scriptanstelle von sh ~/radgeRayden/Scripts/some_script) verkürzen .

Referenz für die Funktion system ()

radgeRayden
quelle
2
Hast du das tatsächlich probiert? Es funktioniert nicht
Dennis
1
Aus dem gleichen Grund sh -c "cd /media/Dan/evolution"funktioniert das nicht. Hinweis: Unterschale
Digitales Trauma
5
cdAbgesehen von / subshell-Problemen, was ist der Vorteil beim Umbrechen eines Shell-Befehls in c program, wenn Sie diesen Befehl genauso einfach (oder einfacher) in ein Shell-Skript einfügen könnten?
Digitales Trauma
1
Dies ist kein Experte, aber sollte so etwas (hoffentlich etwas Nützlicheres) nicht in / usr / local / bin abgelegt werden?
Joe
2
Selbst wenn dies funktionieren KÖNNTE, sollte es nicht in / usr / local / bin abgelegt werden, da es für den einen Benutzer spezifisch ist.
Johan