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).
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.
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:
~/.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
Am Ende ~/.bashrcdeklarieren Sie Ihre eigene Funktion, zum Beispiel:
find_dirs(){
find "$1"-type d
}
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.
/usr/local/bin
Chaos mit den fallen$PATH
?~/.bashrc
(wie essource
d ist) darin besteht, dass Bash nach Funktionen sucht, bevor PATH-Lookup ausgeführt wird.Die beste Wahl wäre
~/.bashrc
Datei.Sie können entweder Ihre Shell-Funktionsdefinitionen direkt in Ihre
~/.bashrc
Datei schreiben , oder, wenn Sie viele davon haben und Ihre~/.bashrc
Datei 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~/.bashrc
Datei. Wenn zum Beispiel die Datei mit Ihren Funktionen benannt istbash_functions
, fügen Sie einfach~/.bashrc
die folgenden Zeilen in Ihre Datei ein:oder äquivalent:
wo
.
ist nur eine symbolische Darstellung vonsource
. Derif
Test stellt sicher, dass die Datei/path/to/bash_functions
vorhanden ist, bevor versucht wird, sie als Quelle zu verwenden.Diese Technik ähnelt dem Einrichten von Aliasen in,
~/.bashrc
indem eine Datei mit dem Namen erstellt~/.bash_aliases
und eine ähnliche Syntax wie oben verwendet wird~/.bashrc
, um ihre Existenz zu testen und sie dann als Quelle zu verwenden.quelle
~/.profile
Die 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.Hier ist eine wichtige Prozedur zum Deklarieren einer permanenten Funktion:
~/.bashrc
Datei 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
Am Ende
~/.bashrc
deklarieren Sie Ihre eigene Funktion, zum Beispiel:Speichern und schließen Sie die Datei.
Die
~/.bashrc
Datei wird jedes Mal gelesen, wenn Sie die interaktive Shellssh
öffnen (dh neue Terminalregisterkarte, Anmeldung über oder Öffnen von TTY1 oder einer anderen virtuellen Konsole). Dies ist in Skriptdateien nicht verfügbar, da~/.bashrc
es nicht für nicht interaktive Shells gelesen wird. Es ist auch nicht verfügbar , wenn Sie laufenbash
mit--norc
Option .Wenn Sie möchten, dass die Funktion auf der aktuell geöffneten Registerkarte sofort verfügbar ist, verwenden Sie den
source ~/.bashrc
Befehl.Funktionen akzeptieren Argumente wie normale Befehle. Geben Sie beispielsweise
$1
durch$9
die Positionsparameter an, wenn Sie eine Funktion aufrufen. Im obigen Beispielfind_dirs
wird nur ein Positionsparameter verwendet und als aufgerufenfind_dirs /etc
. Sie können auch verwenden$@
, um auf alle Positionsparameter zu verweisen. Funktionen akzeptieren auch die Umleitung. Sie können eine Funktion mit aufrufenfind_dirs $1 > /dev/null
; wir könnten es auch wie folgt deklarieren: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.quelle