PS1 in einem script ändern [GELÖST !!!]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
linuxgreenhorn
Beiträge: 3
Registriert: 15.08.2016 18:27:55

PS1 in einem script ändern [GELÖST !!!]

Beitrag von linuxgreenhorn » 15.08.2016 19:54:08

Ich würde gerne (ein) script(e) schreiben mit dessen (deren) Hilfe ich die Variable PS1 jederzeit ändern kann.
Bisher bin ich wie folgt vorgegangen:
_________________

> export PS1

_________________

der Inhalt meines test scripts mit dem Namen: ".prompt1" ist:

__________________________

#!/bin/bash

echo user=$USER
echo path=$PATH
echo PS1=$PS1
echo PS2=$PS2

PS1='\u > '

echo $PS1

____________________________


Wenn ich das script ausführe mit:
__________________________

> ./.prompt1

__________________________

erhalte ich:
___________________________

user=root
path=/user/local/ ...
PS1=
PS2=
\u >
>

___________________________

d.h. die Umgebungs Variablen PS1 und PS2 werden in keiner Richtung weitergegeben.

Ich suche schon 2 Tage, habe aber nichts brauchbares gefunden.
Über Eure hilfe würde ich mich sehr freuen !!!

Schon mal vielen Dank im Voraus
Zuletzt geändert von linuxgreenhorn am 16.08.2016 09:21:50, insgesamt 1-mal geändert.

tobo
Beiträge: 2339
Registriert: 10.12.2008 10:51:41

Re: PS1 in einem script ändern

Beitrag von tobo » 15.08.2016 22:35:08

linuxgreenhorn hat geschrieben:d.h. die Umgebungs Variablen PS1 und PS2 werden in keiner Richtung weitergegeben.
In das Skript rein wird das wohl interaktiv sein müssen. Also entweder starten mit bash -i .prompt1 oder einfacher mit der Shebang #!/bin/bash -i. Aus dem Skript heraus muss auf jeden Fall exportiert werden, wobei das aber keine Lösung für die aktuelle Shell ist und möglicherweise beim Einlesen der Konfigurationsdateien einer neuen Shell auch gar keine Wirkung zeigt!? Alternativ (für rein ins Skript und in der aktuellen Shell) könntest du das Skript, so wie ist, auch einfach sourcen (Aufruf mit . .prompt1 bzw. source .prompt1).

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: PS1 in einem script ändern

Beitrag von MartinV » 15.08.2016 22:40:12

Ein Verdacht ist, daß beim Aufruf eines externen Skriptes die Umgebungsvariablen von bash neu gesetzt werden, so daß Dein eigener Eintrag überschrieben wird.

Hast Du mal versucht:
export myPS1="Mein Prompt"

und im aufgerufenen Skript:
echo $myPS1
PS1=$myPS1
echo $PS1
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

linuxgreenhorn
Beiträge: 3
Registriert: 15.08.2016 18:27:55

Re: PS1 in einem script ändern

Beitrag von linuxgreenhorn » 16.08.2016 07:35:56

Hallo tobo, hallo MartinV,

erst mal vielen Dank für Eure Antworten.

tobo:
hab's gleich voller Hoffung ausprobiert.
#!/bin/bash -i hat keinen Effekt auf die Übernahme der Variablen PS1 in das script.
auch der Aufruf mit:
_______________

> . .prompt1

_______________
hat nur den Effekt dass ich mich neu anmelden muss. Leider.

MartinV:

hab' ich schon vorher ausprobiert mit ps1 (statt myPS1)
Wenn ich ps1 vor dem Start des scripts exportiere:
_______________

> export ps1

_______________

wird ps1 in das script übernommen. Auch PS1=$ps1 funktioniert (im script).

Aber PS1 wird nicht in die aufrufende bash übernommen. PS1 bleibt also unverändert.

Ich verstehe das Ganze nicht denn:
in der Datei /etc/bash.bashrc
steht neben vielem Anderen:
______________________________________________
.
.
...
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
...
.
.
______________________________________________

... und das ist schliesslich auch nur ein script.

Nochmals vielen Dank
vielleicht weiss noch jemand was ???

Benutzeravatar
MartinV
Beiträge: 790
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: PS1 in einem script ändern

Beitrag von MartinV » 16.08.2016 08:34:32

Code: Alles auswählen

Wenn ich ps1 vor dem Start des scripts exportiere:
_______________

> export ps1

_______________

wird ps1 in das script übernommen. Auch PS1=$ps1 funktioniert (im script).

Aber PS1 wird nicht in die aufrufende bash übernommen. PS1 bleibt also unverändert
Damit bestätigt sich mein Verdacht: Die Umgebungsvariablen werden überschrieben.
Schau mal in 'man bash' nach den Optionen --norc --noprofile und --rcfile

Code: Alles auswählen

Aber PS1 wird nicht in die aufrufende bash übernommen. PS1 bleibt also unverändert.
Ein child Prozeß kann und darf die Variablen des parent Prozesses nicht verändern.
Du kannst aber die bash als child Prozeß innerhalb des Skriptes starten:

Code: Alles auswählen

#! /bin/bash
export PS1=myprompt
bash --norc --noprofile
Edit:
tobo hat geschrieben:Alternativ (für rein ins Skript und in der aktuellen Shell) könntest du das Skript, so wie ist, auch einfach sourcen (Aufruf mit . .prompt1 bzw. source .prompt1).
Ich glaube, Du hast tobos zweiten Vorschlag gar nicht bemerkt, funktioniert einwandfrei. In einem Skript PS1 definieren und in bash einbinden mit

Code: Alles auswählen

source promptscript
oder

Code: Alles auswählen

. promptscript
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: PS1 in einem script ändern

Beitrag von MSfree » 16.08.2016 08:53:15

MartinV hat geschrieben:Damit bestätigt sich mein Verdacht: Die Umgebungsvariablen werden überschrieben.
Der Prompt wird in folgenden Dateien gesetzt:

/etc/profile
/etc/bash.bashrc
~/.profile
~/.bashrc

In welcher Reihenfolge diese abgearbeitet werden, weiß ich gerade nicht auswendig, die in /etc kommen aber zuerst dran, dann die in ~

Wenn das also per Skript erfolgen soll, muß man dieses einfach als letztes ausführen, so daß eventuell vorher gesetzte Werte überschrieben werden. Man kann aber auch einfach die eigenen .profile oder .bashrc editieren, dafür sind sie schließlich da.

linuxgreenhorn
Beiträge: 3
Registriert: 15.08.2016 18:27:55

Re: PS1 in einem script ändern [GELÖST !!!]

Beitrag von linuxgreenhorn » 16.08.2016 09:37:59

Vielen Dank für Eure Mühe !!!

Der Vorschlag von tobo:
_____________________

> . ./.prompt1

_____________________

war des Rätsels Lösung
Danke tobo :hail:

aber:
vom vielen experimentieren war ganz am Ende meines scripts (nach mehreren Leerzeilen)
ein exit versteckt, dass ich immer übersehen habe. :oops:

deshalb hat der Aufruf:
_____________________

> . ./.prompt1

_____________________

dazu geführt dass ich mich neu anmelden musste.

Jetzt läuft's wie gewünscht.

Nochmals vielen Dank.

Antworten