Script in bashrc einbinden

Hallo,

ich bräuchte mal eure Hilfe!

Ich weiß nicht mehr wie ich ein Script in die bash eingetragen habe.

Kann mir da einer von euch helfen?

Vielen Dank!

Grüße

Hallo Revan335,

Verstehe ich dich richtig, Du meinst eher wie im Titel Skript in der .bashrc?
Hm, je nachdem, verschiedene Möglichkeiten:
in der .bashrc wird zuerst geprüft ob /etc/bash_completion existiert, wenn ja, wird diese ausgeführt. Du könntest also für alle gültige Befehle in diese Datei eintragen. Wohlgemerkt, das wird dann für jeden User ausgeführt. Kann sein, daß Du das nicht möchtest, also Skripte nur für dich.
Für dich selbst gibt es (oder sollte es geben) in deinem Homeverzeichnis die Datei .extend.bashrc, die Du für eigene Skripte benutzen kannst. Geht ähnlich, zumindest bei mir muss man das selbst nachtragen, also in die .bashrc folgende Zeilen einfügen:

if [ -f .extend.bashrc ]; then . /.extend.bashrc fi

Je nachdem, was Du möchtest, könnte auch eine Funktion reichen, nach diesem Muster:

funktionsname () { befehl1 befehl2 ... }

die kannst Du dann mit
funktionsname
aufrufen.
Ich denke, Du merkst an meinen etwas schwammigen Antworten, daß ich nicht genau weiss, was Du wirklich möchtest.

Viele Grüße gosia

Vielen Dank schon mal für deine Antwort! @gosia

Wenn ich das Terminal öffne soll sowas Bildschirmfoto von »2017-09-18 23-16-52« erscheinen.

Den Code dazu habe ich in einen testscript.sh script.

Dieser Code/Script muss soweit ich mich noch erinnere in die bashrc, damit sie von jedem User bei jedem Terminal start ausgeführt wird.

Aktuell sieht es so aus:

Speicherort des Scripts.
/bin/scripts/testscript.sh

Eintrag in der bashrc.
/etc/bash/.bashrc

### Test Script!
if [ -f /usr/bin/scripts/testscript.sh ]; then
/usr/bin/scripts/testscript.sh
fi
:

Hallo Revan335,

Hm, da ist aber die /etc/bash/.bashrc nicht ganz der passende Ort. Erstens gilt die /etc/bash/.bashrc systemweit, das heisst für alle User und Du willst doch kaum, daß bei einem anderen User “Hallo root…” erscheint, oder? Benutzerspezifische Einstellungen und Kommandos sollten deshalb in ~/.bashrc geschrieben werden.
Aber unabhängig davon gibt es noch ein zweites Problem. Beide .bashrc werden nur einmal beim Einloggen ausgeführt und da hast Du sehr wahrscheinlich noch kein Teminal geöffnet.
Verstehe ich das richtig, daß der Text mit Datum und Uhrzeit so eine Art Prompt sein soll, der sich dann immer an die Uhrzeit anpasst, also etwa sowas:

# Hallo root. Es ist Dienstag der 19. September 2017, 16:55:12 Uhr.
# ls -l
# Backup/
# Bilder/
# bin/
...
# Termine.txt
# xyz.png
# Hallo root. Es ist Dienstag der 19. September 2017, 16:55:23 Uhr.
also etwas in die Richtung Bash-Prompt_anpassen
https://wiki.archlinux.de/title/Bash-Prompt_anpassen
oder soll das nur eine einmalige Meldung im Terminal sein?

Viele Grüße gosia

Das es für alle sein soll ist schon richtig.

Da der Username und so weiter ermittelt wird.

Wenn ich das Terminal starte, dann erscheint dort mein Username.
Wenn ich es als root mache, root bzw. zu root switche.

Vielen Dank für deine Hilfe!

Viele Grüße

Revan335

Hallo Revan335,

Gut, hätte ich mir eigentlich selbst denken können.
Aber das Skript ist doch in Ordnung, gefällt mir. Nur der Sinn von
if [ $myhour -lt 1 ]
erschliesst sich mir nicht. Das würde ja bedeuten, daß der Text nur zwischen 00.00 und 00.59 Uhr ausgegeben wird. Absicht?
Also, ein Vorschlag von mir. Sieh mal nach, ob es das ist, was Du möchtest. Das Datumszeug habe ich etwas eingedampft, geht kürzer wenn Du nur den String ausgeben willst.
Mach aus dem Skript eine Funktion:

gruss()
{
USERNAME=$(grep $USER /etc/passwd | cut -d ":" -f5 | cut -d "," -f1)
date +"Hallo $USERNAME, es ist %A der %d. %B %Y, %T Uhr."
}

und packe die in deine /etc/bash/bashrc, dort wird sie so aufgerufen:

PROMPT_COMMAND=gruss

sieht dann etwa so aus:

#
# /etc/bash/bashrc
#

# If not running interactively, don't do anything
[[ $- != *i* ]] && return

[[ $DISPLAY ]] && shopt -s checkwinsize

gruss()
{
USERNAME=$(grep $USER /etc/passwd | cut -d ":" -f5 | cut -d "," -f1)
date +"Hallo $USERNAME, es ist %A der %d. %B %Y, %T Uhr."
}

PROMPT_COMMAND=gruss

for sh in /etc/bash/bashrc.d/*.bashrc ; do
	[[ -r ${sh} ]] && source "${sh}"
done

[ -r /usr/share/bash-completion/bash_completion   ] && . /usr/share/bash-completion/bash_completion

Wichtig ist nur die Funktion gruss() und deren Aufruf mit
PROMPT_COMMAND=gruss
und daß nachher nicht noch irgendwo ein anderes PROMPT_COMMAND=irgendwas kommt.

Dann neu einloggen und ein Terminal aufmachen. Soll es so aussehen?

Viele Grüße gosia

PS. Wäre nett, wenn Du deine Skripte nicht als Screenshot, sondern als Text reinstellst. Erspart mir die Arbeit des Abtippens

1 Like

Ich bin mir nicht ganz sicher ich glaube so etwas mit zsh zu machen ist einfacher.

Hallo RocknRolf,

Könnte sein, aber ich kann nur Bash :frowning:
Andererseits sind das ja nur zwei Zeilen in der Funktion und eine für den Aufruf der Funktion.
Aber ich weiss auch nicht genau, wie Revan335 das letztlich haben will, als Prompt, wie ich das gemacht habe oder irgendwie anders. Ich denke, Revan335 hat sicher auch nichts gegen eine Lösung in zsh.

Viele Grüße gosia

Ich bin leider auch nicht der grosse zsh geek. Ich benutze es weil mir da die auto-completion besser gefällt und in Verbindung mit oh-my-zsh hat man schnell was optisch ansprechendes und über die mitgelieferten plugins spare ich mir viel Eigenarbeit…

Hallo gosia,

vielen Dank für eure Hilfe!

Vermutlich habe ich noch was vergessen.
Es wird leider nichts angezeigt.

So sieht meine nach der Ergänzung aus.

Ich habe gerade bemerkt, dass ich bei dem Screenshot was vergessen hatte. Sorry, Asche auf mein Haupt!

#!/bin/bash

##Var
myhour=$(date +%H)
mytime=$(date +%T)
mytag=$(date +%A)
mydatum=$(date "+%d. %B %Y")
USERNAME=$(grep $USER /etc/passwd | cut -d ":" -f5 | cut -d "," -f1)

##Das eigentliche Script
if [ $myhour -lt 1 ]
    then
        echo "Hallo $USERNAME. Es ist $mytag der $mydatum, $mytime Uhr. Meldung 1"
    elif [ $myhour -lt 6 ]; then
        echo "Hallo $USERNAME. Es ist $mytag der $mydatum, $mytime Uhr. Meldung 2!!!"
    elif [ $myhour -lt 11 ]; then
        echo "Guten Morgen, $USERNAME. Welcome! Es ist $mytag der $mydatum, $mytime Uhr."
    elif [ $myhour -lt 18 ]; then
        echo "Guten Tag, $USERNAME. Welcome! Es ist $mytag der $mydatum, $mytime Uhr."
    elif [ $myhour -lt 23 ]; then
        echo "Guten Abend, $USERNAME. Es ist $mytag der $mydatum, $mytime Uhr."
    elif [ $myhour -lt 24 ]; then
        echo "Hallo $USERNAME. Es ist $mytag der $mydatum, $mytime Uhr. Meldung 3!"
fi

##Hier das Ende
#exit 0

Viele Grüße

Revan335

Hallo Revan335,
sorry, das sind die kleinen Unterschiede zwischen Artix und Manjaro :frowning: Pack den Code mal nach /etc/bash.bashrc, nicht in /etc/bash/bashrc. In einer virtuellen Maschine mit Manjaro wird jedenfalls /etc/bash.bashrc ausgeführt. Kontrolliere auch mal, ob die Funktion aufgerufen wurde, indem Du in einem Terminal
echo $PROMPT_COMMAND
eingibst. Das sollte
gruss
ausgeben.

Das ist kein Problem, es erklärt mir, warum Du diese Abfrage mit $myhour hattest. Aber zu Testzwecken ist es erstmal egal, ob es “Guten Morgen” oder “Guten Tag” ausschreibt.

Aber bitte, nochmal, warum bringst das Skript als Screenshot, das macht das nachvollziehen ziemlich umständlich.

Viele Grüße gosia

1 Like

Hallo gosia,

Super dies war es.

In die /etc/bash.bashrc eintragen und es funktioniert.

Vielen, Vielen Dank!

Viele Grüße

Revan335

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.

Forum kindly sponsored by