bash Funktion soll man(1) ersetzen

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

bash Funktion soll man(1) ersetzen

Beitrag von smutbert » 26.02.2014 18:54:07

Hi, bin mir nicht sicher, ob das ein „fortgeschrittenes Thema“ ist, aber ich komme nicht weiter und hier paßt es glaube ich noch am besten:

Ich habe mir in der .bashrc folgende Funktion definiert, damit die manpages in einem eigenen yelp-Fenster angezeigt werden:
man () { (yelp "man:$@" &> /dev/null &) }
Die subshell verhindert, dass ich ständig job-Nummern sehe und soweit funktioniert das prächtig. Ein Problem sind allerdings die „echten“ Konsolen (also etwa tty1-tty6), dort scheitert der Start von yelp natürlich.
Ich bin aber eindeutig zu patschert eine funktionierende Abfrage einzubauen - kann mir bitte jemand zur Hand gehen?

lg smutbert

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: bash Funktion soll man ersetzen

Beitrag von syssi » 26.02.2014 19:16:11

Du koenntest die Umgebungsvariable TERM pruefen.

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

Re: bash Funktion soll man ersetzen

Beitrag von smutbert » 26.02.2014 20:34:08

Danke!

Setzen die Variable alle üblichen X-Terminals auf xterm? Habe sicherheitshalber noch eine Abfrage auf die DISPLAY Variable eingebaut. Jetzt sieht es so aus (falls jemand dasselbe möchte oder einen Verbesserungsvorschlag hat)

Code: Alles auswählen

if [ ! -z ${DISPLAY+x} ] && [ ${TERM} = xterm ]; then
	man () { (yelp "man:$@" &> /dev/null &) }
fi

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

Re: bash Funktion soll man ersetzen

Beitrag von inne » 26.02.2014 22:45:32

Auf Linux und ich gabs mal dieses:

Code: Alles auswählen

$ cat /usr/local/bin/gman
#!/bin/sh
yelp man:$1
Also statt den Befehl man zu überschreiben, baut man sich einen neuen.

Benutzeravatar
Dogge
Beiträge: 1899
Registriert: 13.09.2010 11:07:33
Lizenz eigener Beiträge: MIT Lizenz

Re: bash Funktion soll man ersetzen

Beitrag von Dogge » 26.02.2014 23:10:59

@smutbert
coole Idee. Ich habe bisher immer die manpages im Browser betrachtet, da ich im Terminal ungern größere Texte lese. Habe es bisher über ein Suchkürzel im Firefox gemacht. → http://blog.mdosch.de/2013/12/14/debian ... e-oeffnen/

@inne,
das ist wirklich praktisch.

Nachtrag:

Leider werden bei mir in yelp " nicht angezeigt, sondern Fragezeichensymbole. Sieht irgendwie aus als wäre die Zeichenkodierung nicht in Ordnung. Aus "text" in der manpage wird ?text?

Außerdem finde ich es so etwas schöner:

Code: Alles auswählen

cat /usr/local/bin/gman 
#!/bin/sh
yelp man:$1 2>/dev/null &
Da kann ich im Terminal weiterarbeiten während ich die manpage zum Nachschlagen offen habe.
Debian Testing + Gnome | Linux-Anfänger seit 04/2003
http://files.mdosch.de/2014-07/0xE13D657D.asc

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

Re: bash Funktion soll man ersetzen

Beitrag von inne » 26.02.2014 23:52:57

Dogge hat geschrieben: Außerdem finde ich es so etwas schöner:
[...]
Da kann ich im Terminal weiterarbeiten während ich die manpage zum Nachschlagen offen habe.
Stimmt ;-) Ich habe mein Skript mal so geändert, das auch die Sektion angegeben werden kann. Wie bei man auch.

Code: Alles auswählen

cat /usr/local/bin/gman 
#!/bin/sh

cd

if test $# -eq 2; then
	set -- "$2($1)"
fi

if test $# -ne 1; then
	cat <<END >&2
Fehler...
Ungültige Parameter: $@
Usage: $(basename $0) [Sektion] Handbuchseite
END
	exit 255
fi

nohup yelp "man:$1" >/dev/null 2>&1 &

Ob man das nohup braucht, oder es schöner findet, wenn mit dem Termianl auch die Handbuchseite zu geht...
Zuletzt geändert von Anonymous am 27.02.2014 08:26:02, insgesamt 3-mal geändert.

Benutzeravatar
Dogge
Beiträge: 1899
Registriert: 13.09.2010 11:07:33
Lizenz eigener Beiträge: MIT Lizenz

Re: bash Funktion soll man ersetzen

Beitrag von Dogge » 27.02.2014 00:08:10

Ich muss hier zugeben, dass ich nie kapiert habe wie was die Sektionen bedeuten. Ich überfliege immer die manpage bis ich finde was ich suche.
Ich sollte mir mal "man man" anschauen. :lol:

Ach ja, der Titel ist komisch. Ich dachte zuerst es gibt eine fehlerhafte bash-Funktion die ersetzt werden soll. (man als deutsches Wort statt als Debianman interpretiert :D)
Debian Testing + Gnome | Linux-Anfänger seit 04/2003
http://files.mdosch.de/2014-07/0xE13D657D.asc

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

Re: bash Funktion soll man ersetzen

Beitrag von inne » 27.02.2014 00:16:47

Dogge hat geschrieben:Ich muss hier zugeben, dass ich nie kapiert habe wie was die Sektionen bedeuten. Ich überfliege immer die manpage bis ich finde was ich suche.
Sektion 5 (Aufbau von Konfigurationsdateien etc.) geziehlt öffnen zu können ist glaub schon was wert ;-)

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

Re: bash Funktion soll man ersetzen

Beitrag von smutbert » 27.02.2014 10:12:03

Dass man auf meine Art keine Sektion angeben kann ist wirklich ein Nachteil, das ist mir gestern auch noch aufgefallen. Also werde ich innes Idee übernehmen (=klauen) und vielleicht auch davon absehen die ganze Konstruktion man zu nennen.

Das Problem mit den " hat yelp bei mir übrigens auch, stört mich aber nicht weiter.

Ersetzt man im yelp Kommando man: durch info:, kann man übrigens auch auf die info-Dokumentation zugreifen.

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

Re: bash Funktion soll man ersetzen

Beitrag von smutbert » 06.03.2014 16:49:55

Weißt gar nicht, ob ich das noch posten soll, denn gegenüber innes Skript habe ich kaum etwas verändert, aber ich mach es einfach trotzdem. Es sind zwei Skripte geworden, eines namens m für die manpages und das andere i für die Info-Dokumente:

m

Code: Alles auswählen

#!/bin/bash
if [ ! -z ${DISPLAY+x} ] && [ ${TERM} = xterm ]; then
	if test $# -eq 2; then
		set -- "$2($1)"
	fi
	if test $# -ne 1; then
cat <<EOF >&2
usage: $(basename $0) [Sektion] Handbuchseite
EOF
exit 255
	fi
        (yelp "man:$1" &> /dev/null &)
else
        man "$@"
fi
i

Code: Alles auswählen

#!/bin/bash
if [ ! -z ${DISPLAY+x} ] && [ ${TERM} = xterm ]; then
        (yelp "info:$@" &> /dev/null &)
else
        info "$@"
fi
Ach und haltet ihr dir die ein-Buchstaben-kurzen Namen der Skripte für einen Fehler?

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

Re: bash Funktion soll man ersetzen

Beitrag von inne » 06.03.2014 18:08:40

smutbert hat geschrieben:... haltet ihr dir die ein-Buchstaben-kurzen Namen der Skripte für einen Fehler?
Wieso sollten die falsch sein? IMO wären gman und ginfo (für Gnome) bzw. yman yinfo (für Yelp) aber schöner.

Andere machen es aber auch so: Hier gibt es u.a. die Befehle /usr/bin/w (who) ein Systembefehl und mein eigenes Skript d (Date; Ein Skript was cal -A 1; calendar -A 7; date +"Zeit: %T" aufruft).

Der Name d wurde sogar so hergleitet, bzw. war w Vorbild für den Name d. Ist aber nicht mir eingefallen.

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

Re: bash Funktion soll man ersetzen

Beitrag von smutbert » 06.03.2014 18:22:57

keine Ahnung — hätte ja sein können, dass i oder m ein üblicher Alias oä für einen komplett anderen Befehl ist, dann hätte ich mir einen anderen Namen ausgedacht. Ich will halt etwas möglichst kurzes.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: bash Funktion soll man(1) ersetzen

Beitrag von Cae » 07.03.2014 00:24:21

Dogge hat geschrieben:Ach ja, der Titel ist komisch. Ich dachte zuerst es gibt eine fehlerhafte bash-Funktion die ersetzt werden soll. (man als deutsches Wort statt als Debianman interpretiert :D)
Eindeutiger wird's, indem man die passende Sektion des Programms in Klammern dazu schreibt. Damit laesst sich naemlich prima die /etc/passwd (aka. passwd(5), 5 sind Dateien) vom Programm passwd(1) unterscheiden. Dazu kommt noch Sektion 8 fuer hauptsaechlich root-only-Befehle, und dann war's das auch schon. Und wenn man zum Beispiel bei ip nicht weiss, ob es nun Sektion 1 oder 8 ist (8 ist richtig), guckt man einfach auf das erste Wort der Manpage oben links.

Ich hab' den Titel mal dahingehend ergaenzt.

Zum eigentlichen Problem: Ich wuerde auf das richtige $TERM matchen (linux), anstatt alle anderen auszuschliessen:

Code: Alles auswählen

[ xlinux = "x$TERM" ] || man() { ... }
$DISPLAY ist natuerlich auch 'ne Idee.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

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

Re: bash Funktion soll man(1) ersetzen

Beitrag von smutbert » 07.03.2014 11:37:14

Hi Cae, und dankeschön
allerdings hast du dir mit diesem Vorschlag die nächste dumme Frage eingehandelt: Wieso das x vor linux bzw. $TERM?

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

Re: bash Funktion soll man(1) ersetzen

Beitrag von smutbert » 23.02.2016 12:50:13

Nachdem dieses Problem gelöst ist und ich das schlimmste Chaos, das ich in meinem Skript angerichtet habe, wieder beseitigt habe, sehe ich mich in der Lage, die aktuelle Version meines Skriptes herzuzeigen:

Code: Alles auswählen

#!/bin/bash
# simple wrapper for man to display manpages in yelp if X is detected

if test $# -eq 2; then
	ARGS="$2($1)"
else
	ARGS="$1"
fi

if ! man $@ > /dev/null || test $# -gt 2; then
	>&2 echo "usage: $(basename $0) [section] manpage"
	exit 5
elif test "x$1" = "x-h" || test "x$1" = "x--help" || test "x$2" = "x-h" || test "x$2" = "x--help"; then
	>&2 echo "usage: $(basename $0) [section] manpage"
else
	if ! type yelp > /dev/null; then
		>&2 echo "yelp not found, calling man..."
		man $@
	elif test ${SSH_CLIENT}; then
		>&2 echo "ssh-session detected, calling man..."
		man $@
	elif test ${UID} -ne 0; then
		if ! test ${DISPLAY}; then
			>&2 echo "no x-server found, calling man..."
			man $@
		else
			THEME=$(gsettings get org.gnome.desktop.interface gtk-theme)
			(env GTK_THEME="${THEME//\'}:dark" yelp "man:${ARGS}" &> /dev/null &)
		fi
	else
		for SESSIONID in $(loginctl --no-legend list-sessions | awk '{print $1}'); do
			SESSION=$(loginctl show-session ${SESSIONID})
			USERNAME=$(echo "${SESSION}" | sed -ne 's/^Name=//p')
			DISPLAY=$(echo "${SESSION}" | sed -ne 's/^Display=//p')
			TYPE=$(echo "${SESSION}" | sed -ne 's/^Type=//p')
			REMOTE=$(echo "${SESSION}" | sed -ne 's/^Remote=//p')
			ACTIVE=$(echo "${SESSION}" | sed -ne 's/^Active=//p')
			if test ${ACTIVE} = "yes" && test ${TYPE} = "x11" && test ${REMOTE} = "no"; then
				THEME=$(su - ${USERNAME} -c "env \
				XAUTHORITY=\"$(getent passwd ${USERNAME} | cut -d: -f6)/.Xauthority\" \
				DISPLAY=${DISPLAY} \
				gsettings get org.gnome.desktop.interface gtk-theme")
				su - ${USERNAME} -c "env \
				XAUTHORITY=\"$(getent passwd ${USERNAME} | cut -d: -f6)/.Xauthority\" \
				DISPLAY=${DISPLAY} \
				GTK_THEME=\"${THEME//\'}:dark\" \
				yelp \"man:${ARGS}\" &> /dev/null" &
				exit
			fi
		done
		>&2 echo "no active x-session found, calling man..."
		man $@
	fi
fi
Das schöne ist, dass jetzt, auch wenn mit su gerade als root am lokalen Rechner arbeitet, yelp mit der Manpage in X für den gerade aktiven Nutzer des Systems gestartet wird.

____

Alternativ zu yelp habe ich auch versucht die Manpage mit dem Browser anzeigen zu lassen, so in der Art

Code: Alles auswählen

$ man --html=x-www-browser 1 cp
aber daraufhin zeigt mir mein Browser nur
Error opening file: No such file or directory
und er hat recht - es sieht so aus als würde man die html-Datei zwar erstellen, aber sie gleich wieder löschen, noch bevor sie der Browser überhaupt laden kann.

Benutzeravatar
hikaru
Moderator
Beiträge: 13903
Registriert: 09.04.2008 12:48:59

Re: bash Funktion soll man(1) ersetzen

Beitrag von hikaru » 23.02.2016 13:16:47

smutbert hat geschrieben:Alternativ zu yelp habe ich auch versucht die Manpage mit dem Browser anzeigen zu lassen, so in der Art

Code: Alles auswählen

$ man --html=x-www-browser 1 cp
aber daraufhin zeigt mir mein Browser nur
Error opening file: No such file or directory
und er hat recht - es sieht so aus als würde man die html-Datei zwar erstellen, aber sie gleich wieder löschen, noch bevor sie der Browser überhaupt laden kann.
Das ist einem kurzen Test zufolge vermutlich das selbe Problem wie hier. [1]
Lösung: Debiangroff installieren!

[1] viewtopic.php?f=29&t=158089

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

Re: bash Funktion soll man(1) ersetzen

Beitrag von smutbert » 23.02.2016 13:27:09

groff ist installiert. Das Problem ist, dass der Browser bereits läuft und »man --html=…« sozusagen nur einen "Fernbedienungsbefehl" absetzt, der sofort fertig ist, woraufhin »man« denkt: „Aha, der Browser hat sich beendet, dann entsorge ich brav die eben erst erstellten html-Dateien.“

Benutzeravatar
hikaru
Moderator
Beiträge: 13903
Registriert: 09.04.2008 12:48:59

Re: bash Funktion soll man(1) ersetzen

Beitrag von hikaru » 23.02.2016 13:49:20

Bist du dir sicher, dass Debiangroff installiert ist? /usr/bin/groff kommt aus Debiangroff-base, was allein aber nicht ausreicht.

Ich sitze hier vor meinem Jessie-Netbook mit einem aus einer Minimalinstallation hervorgegangenen Xfce und der Browser (Iceweasel) lief bereits.
Wenn ich ohne Debiangroff dein Kommando absetze bekomme ich diese Ausgabe:

Code: Alles auswählen

$ man --html=x-www-browser 1 cp
man: Befehl mit Exit-Status 3 beendet: /usr/lib/man-db/zsoelim | /usr/lib/man-db/manconv -f UTF-8:ISO-8859-1 -t UTF-8//IGNORE | preconv -e UTF-8 | tbl | groff -mandoc -Thtml
Installiere ich Debiangroff nach und wiederhole das Ganze, dann kommt nach einer Gedenksekunde der Browser mit der Manpage zu cp in einem neuen Tab nach oben, während die Fehlermeldung im Terminal ausbleibt.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: bash Funktion soll man(1) ersetzen

Beitrag von heisenberg » 23.02.2016 13:50:15

Hi,

Code: Alles auswählen

man --html=x-www-browser 1 cp
tut bei mir wunderbar(Jessie) mit Browser Iceweasel, Firefox oder Google Chrome. Bei laufendem oder auch nicht laufendem Browser. groff musste ich noch installieren.



Grüße,
h.

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

Re: bash Funktion soll man(1) ersetzen

Beitrag von smutbert » 23.02.2016 14:42:31

Aha, mit anderen Browsern funktioniert es also.

@hikaru
Ich bin mir so sicher, wie man sich nur sein kann:

Code: Alles auswählen

$ dpkg -l 'groff*'
…
ii  groff               1.22.2-8       amd64          GNU troff text-formatting system
ii  groff-base          1.22.2-8       amd64          GNU troff text-formatting system (base syst
…
$ update-alternatives --display x-www-browser
x-www-browser - automatischer Modus
  Link verweist zur Zeit auf /usr/bin/epiphany-browser
/usr/bin/epiphany-browser - Priorität 85
  Slave x-www-browser.1.gz: /usr/share/man/man1/epiphany-browser.1.gz
/usr/bin/midori - Priorität 50
  Slave x-www-browser.1.gz: /usr/share/man/man1/midori.1.gz
Gegenwärtig »beste« Version ist »/usr/bin/epiphany-browser«.
Es funktioniert, wenn der Browser noch nicht läuft, also zB mit einem Browser, den ich nicht gerade verwende

Code: Alles auswählen

$ man --html=midori 1 cp
ich könnte epiphany einfach vorher killen, aber das will ich nicht, weil ich gerade an diesem Beitrag schreibe :wink: Mit einem Wrapper-Skript um den Browser herum (statt x-www-browser) funktioniert es auch:

Code: Alles auswählen

#!/bin/bash

epiphany $1
sleep 3s


vielen Dank jedenfalls, aber dieses Mal habe ich eigentlich gar nicht eure Hilfe gesucht sondern wollte nur mein weiterentwickeltes Skript posten. Also damit es vielleicht nicht ganz untergeht, das in dem Post meine ich:
http://debianforum.de/forum/viewtopic.p ... 5#p1080144

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

Re: bash Funktion soll man(1) ersetzen

Beitrag von uname » 23.02.2016 15:34:41

Nicht das es wichtig wäre. Aber vielleicht sieht das Manual mit "man" ja in einem alternativen Terminal weit besser aus, so dass du Yelp oder einen Browser gar nicht brauchst. Ich nutze z.B. gerne Debianterminator (selbst mit Debianopenbox). Ich würde nie auf die Idee kommen das Manuel über Yelp oder einen Browser umzubiegen. Aber ich nutze auch nie Aliases.

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

Re: bash Funktion soll man(1) ersetzen

Beitrag von smutbert » 23.02.2016 16:03:56

Der Threadtitel stimmt inzwischen nicht mehr ganz. Es ist ein Skript, das ich unter »/usr/local/bin/m« gespeichert habe und ich finde es insofern praktisch als ich aus dem Terminalfenster heraus (jetzt sogar als root) einfach ein Hilfefenster aufmachen kann, das mir die Kommandozeile nicht blockiert wie es »man« machen würde.

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

Re: bash Funktion soll man(1) ersetzen

Beitrag von uname » 23.02.2016 16:18:48

... einfach ein Hilfefenster aufmachen kann, das mir die Kommandozeile nicht blockiert wie es »man« machen würde.
Dafür nutzt man eigentlich Terminalmultiplexer wie Debianscreen oder Debiantmux. Warum das Terminal überhaupt verlassen.

Screen:

Code: Alles auswählen

Ctrl+a S	split terminal horizontally into regions	Ctrl+a c to create new window there
Ctrl+a |	split terminal vertically into regions	Requires screen >= 4.1
Quelle: http://www.pixelbeat.org/lkdb/screen.html

Und wenn das zu viel Mühe ist. Debianterminator kann z.B. auch mehrere Tabs sogar nebeneinander ohne komplizierte Befehle.

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

Re: bash Funktion soll man(1) ersetzen

Beitrag von smutbert » 23.02.2016 16:48:45

terminator habe ich eh auch lange verwendet, aber an die Nutzung dieser Tabs, die neben- und untereinander angezeigt werden, konnte ich mich nie gewöhnen und dasselbe gilt für screen, das verwende ich nur selten. Im Gnome-Terminal, das ich momentan meist verwende, könnte man auch mit <Alt>+<1, 2, …> zwischen den Tabs wechseln, aber irgendwie gefällt es mir mit yelp ganz gut

Ist es denn sooo schlimm das Terminal zu verlassen :wink:
ohne grafische Programme komme ich ohnehin nicht aus.

Sehr angenehm finde ich übrigens auch, dass durch den Aufruf von zB »m rsync« die rsync-Manpage im bereits vorhandenen yelp-Fenster dargestellt wird und nicht ein neues aufgemacht wird. Ich habe mir übrigens auch ein Skript geschrieben, das ich mit der Tastenkombination <Ctrl>+<Space> aufrufe und das mir das Terminalfenster in den Vordergrund holt bzw. wenn keines existiert, mir eines aufmacht — damit wechsle ich von yelp oder vom Browser recht schnell und bequem zurück zum Terminal.

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

Re: bash Funktion soll man(1) ersetzen

Beitrag von uname » 24.02.2016 20:30:59

Alles klar. Bei Linux kann und darf sich jeder seine Anwendungen beliebig zurechtlegen. Soll hier im Forum teilweise auch nur mal ein Vorschlag sein. Ich lese z.B. mittlerweile kaum Manuals. Ich suche gleich Lösungsideen im Internet und bau die dann einfach um.

Antworten