übertriebener Shell Prompt

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

übertriebener Shell Prompt

Beitrag von smutbert » 22.08.2016 22:25:46

Hi liebe Leute,

mein PS1 (bash) ist das reinste Chaos und hat einige Nachteile. Ich will euch nicht gleich mit dem kompletten Wahnsinn meines PS1 abschrecken, hier also erstmal nur einer der schlimmsten Teile

Code: Alles auswählen

\[\033[1;$(EXITSTATUS=${?}; [[ ${EXITSTATUS} > 0 ]] && echo 31 || echo 32; exit ${EXITSTATUS})m\]${?}
Wenn es sein muss poste ich natürlich auch den Rest des Wahnsinns. Meine Fragen würden sich dadurch aber nicht ändern:
  • Kennt ihr elegantere Wege in der bash dasselbe zu erreichen?
  • Ließen sich solche Dinge in der zsh leichter machen?
    Ich tue mich irgendwie schwer mich auch nur ansatzweise mit der zsh vertraut zu machen.
lg smutbert

inne
Beiträge: 3289
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: übertriebener Shell Prompt

Beitrag von inne » 22.08.2016 23:21:22


uname
Beiträge: 12398
Registriert: 03.06.2008 09:33:02

Re: übertriebener Shell Prompt

Beitrag von uname » 23.08.2016 09:23:53

Ich wollte mich auch immer schon mit Debianzsh beschäftigen. Leider bin ich noch nicht soweit gekommen.

Als Einstieg empfehle ich dir aber:

https://grml.org/zsh

mit der zugehörigen grml-zsh-Konfiguration:

http://git.grml.org/?p=grml-etc-core.gi ... /zsh/zshrc

Und generell würde ich im übrigen ähnlich wie bei grml zusätzlich Debiantmux verwenden.

http://git.grml.org/?p=grml-etc-core.gi ... /tmux.conf

(wie man an der Konfiguration sieht wird das Keybinding von C-b auf C-a umgestellt, somit wird Debiantmux als echter Debianscreen-Ersatz genutzt).
grml ist wirklich cool. Hoffentlich kommt irgendwann mal eine neue Version raus.

Benutzeravatar
Lord_Carlos
Beiträge: 5578
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: übertriebener Shell Prompt

Beitrag von Lord_Carlos » 23.08.2016 10:53:10

uname hat geschrieben:Ich wollte mich auch immer schon mit Debianzsh beschäftigen. Leider bin ich noch nicht soweit gekommen.
Alternative: Debianfish
Vorteil gegenueber zsh und bash: Die default config ist recht brauchbar. Man muss kaum was selber anpassen. (Mehr details gibt es zu genuege im Netz)

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: übertriebener Shell Prompt

Beitrag von smutbert » 23.08.2016 22:18:04

Danke!

fish habe ich gerade kurz ausprobiert. Das ist schon lustig wie und was das alles vervollständigt, aber ich weiß nicht ob das auf Dauer nicht etwas zu viel ist.

Momentan versuche ich mit innes Vorschlag meine Vorstellungen mittels PROMPT_COMMAND umzusetzen.

Wenn ich dann noch nicht die Lust verloren habe, sehe ich mir die zsh in grml etwas genauer an. grml habe ich ja sowieso als iso-Image samt grub-Eintrag „installiert“.

inne
Beiträge: 3289
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: übertriebener Shell Prompt

Beitrag von inne » 24.08.2016 10:56:31

smutbert hat geschrieben:Momentan versuche ich mit innes Vorschlag meine Vorstellungen mittels PROMPT_COMMAND umzusetzen.
Der Code dort, kann eigentlich 1:1 in die ~/.bash_aliases kopiert werden.

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: übertriebener Shell Prompt

Beitrag von smutbert » 24.08.2016 11:38:47

Naja, wie gesagt habe ich nur einen kleinen Teil meines PS1-Wahnsinns gepostet, da kommen auch die Zahl der Background-Jobs, Abfragen ob es sich um eine ssh-Sitzung handelt und ein paar weitere Kleinigkeiten vor und alle diese Dinge ändern auch noch abhöngig vom Zustand ihre Farbe :mrgreen:

Und damit nicht genug muss ich auch noch schauen, dass das nicht mit Debianundistract-me kollidiert, das ebenfalls PROMPT_COMMAND verwendet...

inne
Beiträge: 3289
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: übertriebener Shell Prompt

Beitrag von inne » 24.08.2016 11:48:04

smutbert hat geschrieben:Und damit nicht genug muss ich auch noch schauen, dass das nicht mit Debianundistract-me kollidiert, das ebenfalls PROMPT_COMMAND verwendet...
Die Lösung dazu könntest du bitte dann hier veröffentlichen. Die interessiert mich auch.

Benutzeravatar
Meillo
Moderator
Beiträge: 9233
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: übertriebener Shell Prompt

Beitrag von Meillo » 24.08.2016 12:11:26

smutbert hat geschrieben:Debianundistract-me
Lustig, dass du hier ``undistract-me'' erwaehnst. Bei diesem Begriff denke ich naemlich eher an:

Code: Alles auswählen

export PS1='% '
;-)
Use ed once in a while!

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: übertriebener Shell Prompt

Beitrag von smutbert » 24.08.2016 14:41:27

☺ ich hasse es, wenn mich die initrd auf so einem Prompt zurücklässt...

@Inne
werd ich machen, dauert aber noch etwas

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: übertriebener Shell Prompt

Beitrag von smutbert » 27.08.2016 23:25:55

inne hat geschrieben:Die Lösung dazu könntest du bitte dann hier veröffentlichen. Die interessiert mich auch.
So, also Debianundistract-me legt $PROMPT_COMMAND folgendermaßen fest »preexec_set_exit;preexec_invoke_cmd« bzw. wenn $PROMPT_COMMAND nicht leer ist, dann stellt es den ursprünglichen Inhalt in die Mtte, zB

Code: Alles auswählen

preexec_set_exit;prompt_status;preexec_invoke_cmd
(und funktioniert hinterher nicht mehr).

Stellt man den eigenen Befehl dagegen ganz an den Anfang funktioniert es noch/wieder. Weil Debianundistract-me sich per default ohnehin nur in Login-Shells aktiviert, sieht meine Lösung in der ~/.bashrc so aus:

Code: Alles auswählen

…
unset PROMPT_COMMAND

# undistract-me
if [ ! -z "$BASH_VERSION" -o -z "$PS1" -o -n "$last_command_started_cache" ]; then
	. /usr/share/undistract-me/long-running.bash
	notify_when_long_running_commands_finish_install
fi

export PROMPT_COMMAND="prompt_status;${PROMPT_COMMAND}"
Das unset ist überflüssig, wenn man PROMPT_COMMAND vorher nicht setzt - wie gesagt undistract-me macht das nur bei login-Shells. Ich habe es nur verwendet um den Fehler einzugrenzen und habe es dann dringelassen.

__________

Meine Funktion prompt_status und den PS1, den sie ersetzt hat, werde ich der Vollständigkeit halber auch herzeigen. Davor hat mein PS1 so ausgesehen :mrgreen:

Code: Alles auswählen

'\[\033[1;32m\]${debian_chroot:+[$debian_chroot]}[\[\033[1;$(EXITSTATUS=${?}; [[ ${UID} > 0 ]] && echo 32 || echo 31; exit ${EXITSTATUS})m\]\u\[\033[1;32m\]@\[\033[1;$(EXITSTATUS=${?}; [ -z "${SSH_CLIENT}" ] && echo 32 || echo 33; exit ${EXITSTATUS})m\]\h\[\033[1;32m\]:\[\033[1;34m\]\w\[\033[1;32m\]][\[\033[1;$(EXITSTATUS=${?}; [[ $(jobs -p) ]] && echo 33 || echo 32; exit ${EXITSTATUS})m\]\j\[\033[1;32m\]:\[\033[1;$(EXITSTATUS=${?}; [[ ${EXITSTATUS} > 0 ]] && echo 31 || echo 32; exit ${EXITSTATUS})m\]${?}\[\033[1;32m\]]\[\033[0m\]\$ '
das ist nun diesen Zeilen in der ~/.bashrc gewichen:

Code: Alles auswählen

…

function prompt_status {
	local STATUS="${?}"

	local RESET_COLOUR='\e[0m'
	local STANDARD_COLOUR='\e[1;32m'
	local ERROR_COLOUR='\e[1;31m'
	local OK_COLOUR='\e[1;32m'
	local WARN_COLOUR='\e[1;33m'
	local DIR_COLOUR='\e[1;34m'

	local SIGNAL=""
	local USER_COLOUR="${OK_COLOUR}"
	local HOST_COLOUR="${OK_COLOUR}"
	local STATUS_COLOUR="${OK_COLOUR}"
	local JOBS_COLOUR="${OK_COLOUR}"

	[[ ${UID} = 0 ]] && USER_COLOUR="${ERROR_COLOUR}"
	[ -z "${SSH_CLIENT}" ] || HOST_COLOUR="${WARN_COLOUR}"
	[[ $(jobs -p) ]] && JOBS_COLOUR="${WARN_COLOUR}"

	if [[ ${STATUS} > 0 ]]; then
		if test ${STATUS} -gt 128; then
			SIGNAL="$(builtin kill -l $((${STATUS} - 128)) 2>/dev/null)"
		fi
		STATUS_COLOUR="${ERROR_COLOUR}"
		STATUS="${STATUS}${SIGNAL:+,${SIGNAL}}"
		#echo "[Exit ${STATUS} ${SIGNAL}]"
		#PROMPT_STATUS="${ERROR_COLOUR}✗${RESET_COLOUR}"
	else
		STATUS="✓"
	fi

	PS1="\[${STANDARD_COLOUR}\][\[${USER_COLOUR}\]\u\[${STANDARD_COLOUR}\]@\[${HOST_COLOUR}\]\h\[${STANDARD_COLOUR}\]:\[${DIR_COLOUR}\]\w\[${STANDARD_COLOUR}\]]\[${JOBS_COLOUR}\]\j\[${STANDARD_COLOUR}\]:\[${STATUS_COLOUR}\]${STATUS}\[${STANDARD_COLOUR}\]]\$ \[${RESET_COLOUR}\]"
	return 0
}


# undistract-me
if [ ! -z "$BASH_VERSION" -o -z "$PS1" -o -n "$last_command_started_cache" ]; then
	. /usr/share/undistract-me/long-running.bash
	notify_when_long_running_commands_finish_install
fi

PROMPT_COMMAND="prompt_status;${PROMPT_COMMAND}"
Zuletzt geändert von smutbert am 02.09.2016 21:16:00, insgesamt 2-mal geändert.

Benutzeravatar
TRex
Moderator
Beiträge: 8319
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: übertriebener Shell Prompt

Beitrag von TRex » 28.08.2016 09:40:46

Mit sprechenden Variablennamen fänd ichs vielleicht auch gut.
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: übertriebener Shell Prompt

Beitrag von smutbert » 28.08.2016 10:43:41

Diese merkwürdigen Namen kommen bei mir immer ganz von alleine :oops: aber ich hab den Beitrag geändert, damit es wenigstens ein bisschen besser ist. Und so sieht das Ergebnis aus - die Farben muss man sich dazudenken ☺

Code: Alles auswählen

[user@localhost:~][0:✓]$ true
[user@localhost:~][0:✓]$ false
[user@localhost:~][0:1]$ sleep 100s &
[1] 5819
[user@localhost:~][1:✓]$ sleep 100s
^C
[user@localhost:~][1:130,SIGINT]$ cd /
[user@localhost:/][1:✓]$

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: übertriebener Shell Prompt

Beitrag von smutbert » 01.09.2016 23:31:53

Hat es zufällig jemand ausprobiert?

Die Bash (bzw. mein Prompt) verbockt den Zeilenumbruch, dh statt dass die Befehlszeile in der nächsten Zeile fortgesetzt wird überschreibt sie wieder die aktuelle Zeile angefangen mit dem Prompt - mit der Autovervollständigung mit Tabulator sieht das zB so aus

Code: Alles auswählen

[user@localhost:~][0:✓]$ 
avutil5ocalhost:~][0:✓]$ ls /usr/share/doc/lib 
libavutil54/ libavutil55/ 
avutil5ocalhost:~][0:✓]$ ls /usr/share/doc/liba
Kann mir jemand sagen wo der Fehler liegt?

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: übertriebener Shell Prompt

Beitrag von smutbert » 02.09.2016 21:20:50

Der Fehler lag am (fehlenden) Escapen der Farben - ich habe den obigen Beitrag angepasst und nun scheint es richtig zu funktionieren.

fish habe ich in der Zwischenzeit auch etwas gründlicher ausprobiert, aber das ist mir zu anders... bleibt nur noch, dass ich mir vorgenommen habe mir zsh genauer anzusehen...

Antworten