Wo kann ich eine benutzerdefinierte Shell-Funktion ablegen?

14

Ich plane eine Funktion zu erstellen, die die Dinge für mich vereinfachen würde. Die Funktion wäre so etwas wie

function lazymode()
{
echo "Hello World!";
}

Wenn ich den Befehl lazymodein der Shell verwende , wird der Befehl ausgegeben Hello World!.

Welche Datei soll ich die benutzerdefinierte Funktion setzen?

Abel Melquiades Callejo
quelle

Antworten:

13

Kommt auf die Funktion an. Wenn es sich nur um einen supereinfachen Einzeiler handelt, können Sie einen Alias ​​erstellen oder die Funktion ~/.bashrceinfügen (eine Datei, die beim Start geladen wird).

Wenn Sie etwas fleischigeres erstellen, ist es möglicherweise sinnvoller, ein eigenes ausführbares Skript zu erstellen, ~/bin/das standardmäßig nicht vorhanden ist (es ist nur ein Verzeichnis), das sich jedoch in Ihrem Pfad befinden sollte. Denken Sie daran, dass die Datei ausführbar sein muss ( chmod +x filename) und mit einer richtigen Datei beginnen muss#!/bin/bash Zeilengruppe beginnen muss.

Die zweite Route hat einige klare Vorteile:

  • Es ist einfacher zu sehen, was verfügbar ist
  • Bei einem Syntaxfehler wird Ihr Profil nicht aktualisiert
  • Sie müssen Ihre Bash-Konfiguration nicht ständig neu konfigurieren, wenn Sie das Skript ändern
  • Es ist für jede Shell verfügbar, solange der vollständige Pfad verwendet wird oder auch ~/bin/für diese Shell im Pfad enthalten ist (was in den meisten Fällen AFAIK sein sollte).
Oli
quelle
Ich habe die spätere Option verwendet. Meine Funktion enthält Befehle zum Löschen von Dateien, führt die Befehle javac und java aus. und als ich es auf dem gnome-terminal ausprobiert habe, funktioniert es nicht gut. Denken Sie, dass es ein Problem gibt?
Abel Melquiades Callejo
Was macht es stattdessen?
Oli
Es ist bereits behoben. Behoben durch diese Antwort
Abel Melquiades Callejo
ähm ... sollten User-Skripte nicht in das /usr/local/binChaos mit den fallen $PATH?
Braiam
Es scheint mir, dass ein kleiner, aber erwähnenswerter Vorteil des Einfügens von Funktionen ~/.bashrc(wie es sourced ist) darin besteht, dass Bash nach Funktionen sucht, bevor PATH-Lookup ausgeführt wird.
Zanna
4

Die beste Wahl wäre ~/.bashrcDatei.

Sie können entweder Ihre Shell-Funktionsdefinitionen direkt in Ihre ~/.bashrcDatei schreiben , oder, wenn Sie viele davon haben und Ihre ~/.bashrcDatei nicht überladen möchten , Sie können sie alle in eine andere Datei Ihrer Wahl kopieren - stellen Sie sicher, dass Sie diese als Quelle verwenden Datei in Ihrer ~/.bashrcDatei. Wenn zum Beispiel die Datei mit Ihren Funktionen benannt ist bash_functions, fügen Sie einfach ~/.bashrcdie folgenden Zeilen in Ihre Datei ein:

if [[ -f /path/to/bash_functions ]]; then
    source /path/to/bash_functions
fi

oder äquivalent:

if [[ -f /path/to/bash_functions ]]; then
    . /path/to/bash_functions
fi

wo .ist nur eine symbolische Darstellung von source. Der ifTest stellt sicher, dass die Datei /path/to/bash_functionsvorhanden ist, bevor versucht wird, sie als Quelle zu verwenden.

Diese Technik ähnelt dem Einrichten von Aliasen in, ~/.bashrcindem eine Datei mit dem Namen erstellt ~/.bash_aliasesund eine ähnliche Syntax wie oben verwendet wird ~/.bashrc, um ihre Existenz zu testen und sie dann als Quelle zu verwenden.

Radu Rădeanu
quelle
Danke, es hat funktioniert. Was ist der Unterschied zu .profile? Unter Linux kann ich bashrc nicht verwenden
Abel Melquiades Callejo
2
~/.profileDie Datei wird vom Befehlsinterpreter für Login-Shells ausgeführt. Wenn Sie die grafische Benutzeroberfläche verwenden und das Terminal öffnen, wird diese Datei nicht ausgeführt, da Sie sich in einer nicht angemeldeten Shell befinden.
Radu Rădeanu
1

Hier ist eine wichtige Prozedur zum Deklarieren einer permanenten Funktion:

  1. ~/.bashrcDatei in einem Texteditor öffnen . Es spielt keine Rolle, welcher Texteditor verwendet wird, solange Sie wissen, wie er verwendet wird, und solange Sie den öffnen/home/<username>/.bashrc

  2. Am Ende ~/.bashrcdeklarieren Sie Ihre eigene Funktion, zum Beispiel:

    find_dirs(){
        find "$1" -type d
    }
  3. Speichern und schließen Sie die Datei.

Die ~/.bashrcDatei wird jedes Mal gelesen, wenn Sie die interaktive Shell sshöffnen (dh neue Terminalregisterkarte, Anmeldung über oder Öffnen von TTY1 oder einer anderen virtuellen Konsole). Dies ist in Skriptdateien nicht verfügbar, da ~/.bashrces nicht für nicht interaktive Shells gelesen wird. Es ist auch nicht verfügbar , wenn Sie laufen bashmit--norc Option .

Wenn Sie möchten, dass die Funktion auf der aktuell geöffneten Registerkarte sofort verfügbar ist, verwenden Sie den source ~/.bashrcBefehl.


Funktionen akzeptieren Argumente wie normale Befehle. Geben Sie beispielsweise $1durch $9die Positionsparameter an, wenn Sie eine Funktion aufrufen. Im obigen Beispiel find_dirswird nur ein Positionsparameter verwendet und als aufgerufen find_dirs /etc. Sie können auch verwenden $@, um auf alle Positionsparameter zu verweisen. Funktionen akzeptieren auch die Umleitung. Sie können eine Funktion mit aufrufen find_dirs $1 > /dev/null; wir könnten es auch wie folgt deklarieren:

find_dirs(){
    find "$1" -type d
}

Anmerkung von man bash: "Funktionen werden im Kontext der aktuellen Shell ausgeführt; es wird kein neuer Prozess erstellt, um sie zu interpretieren." Das bedeutet, dass Sie sich auch der Funktionen bewusst sein sollten, mit denen Sie Ihre Shell-Ausführungsumgebung ändern können - Variablen und Terminaleinstellungen ändern.

Sergiy Kolodyazhnyy
quelle