Wie füge ich eine Funktion zu .bash_profile / .profile / bashrc in der Shell hinzu?

24

Ich habe eine Funktion, die die Epochenzeit auf das Datum umrechnet. Hier ist die Definition

date1(){
  date -d @$1
}

Ich möchte schreiben können:

$ date1 xxxyyy

Wobei xxxyyy der Parameter ist, den ich in meine Funktion übergebe, damit ich das entsprechende Datum erhalten kann. Ich verstehe ich es entweder zu addieren haben .bash_profile, .profileoder .bashrcund dann beziehen sie:

$ source file

Ich bin mir aber nicht sicher, in welcher Datei ich es ablegen soll. Derzeit habe ich es in .profile. Aber um es laufen zu lassen, muss ich source .profilejedes Mal tun .

Idealerweise sollte es verfügbar sein, wenn der Computer wie die Umgebungsvariable gestartet wird.

Kumpel
quelle
für ein Eingabemuster; 1. Textausgabe epochconverter.com ist jetzt 1514917788; 2.von bash sich $ date +% s pro stackoverflow.com/questions/1092631/…
AnneTheAgile

Antworten:

25

Von man bash:

Wenn bash als interaktive Anmeldeshell oder als nicht interaktive Shell mit der Option --login aufgerufen wird, werden zuerst Befehle aus der Datei / etc / profile gelesen und ausgeführt, sofern diese Datei vorhanden ist. Nach dem Lesen dieser Datei sucht sie in dieser Reihenfolge nach ~ / .bash_profile, ~ / .bash_login und ~ / .profile und liest und führt Befehle von der ersten Datei aus, die vorhanden und lesbar ist.

Mit anderen Worten, können Sie es in einen der setzen ~/.bash_profile, ~/.bash_loginoder ~/.profile, oder alle Dateien , sourced entweder die . In der Regel ~/.profilewird als Quelle ~/.bashrcdie "persönliche Initialisierungsdatei für Login-Shells" ausgeführt.

Um es zu aktivieren, starten Sie entweder eine neue Shell, exec $SHELLoder führen Sie sie aus source ~/.bashrc.

l0b0
quelle
1
Nun, ich habe versucht, eine benutzerdefinierte Funktion zum Drucken des Arguments zu erstellen, aber selbst wenn ich diese Funktion hinzufüge, muss .bash_profileich dies source ~/.bash_profilejedes Mal tun, wenn ich das Terminal über eine Verknüpfung öffne Ctrl+Alt+T.
Vicky Dev
@VickyDev Wenn Sie dies source ~/.bash_profilejedes Mal müssen, ist dies ein Hinweis darauf, dass Ihr Bash-Setup nicht dem Standard entspricht oder fehlerhaft ist (gemäß der man bashgenannten Ausgabe). Bist du sicher, dass du Bash ausführst? Zum Beispiel echo $BASHPIDdruckt irgendetwas?
l0b0
Müssen Sie #!/bin/shoben hinzufügen .profile, um eine Funktion zu definieren?
Kolob Canyon
13

Nachdem Sie die Funktion in Ihrer definiert haben .profile, fügen Sie hinzu export -f date1. Dadurch wird die Funktion zur Verwendung durch Ihre Anmeldeshell exportiert.

DopeGhoti
quelle
+1 für den Export musste ich in ssh ProxyCommand und alias aufrufen, und es ging weiter um Alias, der nicht gefunden wurde, auch nicht nach dem Quellprofil. Funktioniert wie ein Zauber nach dem Export.
Abhishek Anand
7

Anpassungen für interaktive Shells werden vorgenommen ~/.bashrc. Dinge, die Sie ausführen möchten, wenn Sie sich anmelden, gehen in ~/.profile(oder ~/.bash_profile, aber es wird oft nicht geladen, wenn Sie sich grafisch anmelden ).

Setzen Sie diese Funktionsdefinition in ~/.bashrc.

Da bash nicht geladen wird, .bashrcwenn es sich um eine Login-Shell handelt, müssen Sie dies erzwingen: Schreiben Sie ein ~/.bash_profileContaining

. ~/.profile
case $- in *i*) . ~/.bashrc;; esac

dh laden ~/.profile, und auch laden, ~/.bashrcwenn die Shell interaktiv ist.

Siehe Alternative zu .bashrc und die dort verlinkten Beiträge.

Gilles 'SO - hör auf böse zu sein'
quelle
1

csh und tcsh unterstützen keine Funktionen wie bash, aber Sie können es tun.

Zum Beispiel ist hier eine einfache Funktion zum Drucken von Text

alias print_hello_world 'eval echo "hello world"'

Übergabe von Argumenten an das Skript

repeate_after_me 'eval echo "$1"'

Mehrzeiliger Code wie eine if-Anweisung ist etwas kompliziert, aber los geht's.

alias X 'eval "if (\!:1 =~ 'yes') then \\
          echo yes \\
          else \\
          echo no \\
          endif"'

Sie müssen noch evalieren, aber der komplexeste Teil ist die \!:[x]Syntax, um die Eingabe über die Befehlszeile zu erhalten.

Das sollte ausreichen, um Sie in Ordnung zu bringen.

user1610950
quelle
0

Sie können alle aktuellen Funktionen mit typeset nach bashrc umleiten .

So füge ich beispielsweise eine Funktion eines Openstack-Befehls mit optionalem Parameter in bashrc ein:

urc() { . stackrc; set -x; openstack server list --all $1; set +x; }
typeset -f >> ~/.bashrc

Jetzt wird es für zukünftige Sitzungen gespeichert und kann wie folgt verwendet werden:

$ urc 

oder

$ urc --debug
Noam Manos
quelle
-1

Punkt 18: In meinem älteren Gedächtnis, als ein Admin ksh und bash lernte, war es umgekehrt. 1: - Der Inhalt von / etc / profile ist sysWide. / etc / skel enthielt die Datei, die neuen Konten übergeben wurde. Seit Bash ist nun Prime allen Distributionen gemeinsam. Das nächste wäre 2: - ~ / .profile als Systemstandard, dann würde in den Inhalten von .profile "if exists" .bash_profile gesetzt -> 3: - .bash_profile 4: - .bash_login 5: -. bashrc .bash_aliases sein Meiner Meinung nach ist die richtige Reihenfolge, die Einrichtung der Standard-Terminal- und Shell-Umgebung und übliche .bash_login nie gefunden oder vorhanden (es ist benutzerdefiniert pro Benutzer). Mit .profile $ PATH als main, wenn das.
Ich stelle fest, dass jetzt auch .bash_profile hinzugefügt wird .profile dominiert immer noch und respektiert das Vorhandensein von .bash_profile nicht. Zusammen mit den Header-Informationen wird niemand aktualisiert, z. B .: Bash-Start Beispiele - diese Verzeichnisstruktur ist nicht mehr vorhanden - zusammen mit Beispielen und / oder Dateien werden gzip-komprimiert. Ein Update auf Gnu-Bash ist also angebracht

AtomicK
quelle
1
Worum geht es dir?
Jesse_b