Frage zur Bash-Programmierung

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
the_isz
Beiträge: 101
Registriert: 17.11.2003 16:50:27

Frage zur Bash-Programmierung

Beitrag von the_isz » 21.03.2004 22:57:54

Hi Ihr,

ich hoffe ja mal, ich poste hier nicht in die gnadenlos falsche Ecke, aber ich hätte da mal ne Frage, falls hier jemand zuliest, der sich mit der Bash gut auskennt.
Falls es sich hier doch um das absolut falsche Forum handelt: So wichtig ist der Thread wirklich nicht, also dann einfach ab in den Müll!

Ich habe angefangen mich etwas mit Shell Programmierung zu beschäftigen, weil Shells ja doch einer DER Vorteile von Linux Systemen gegenüber den Systemen aus Redmond sind.
Da ich klein anfangen will, schreibe ich erstmal kleine Scripte. Ich habe folgendes vor:

Seit meinem letzen System-Upgrade funktioniert der Befehl "xhost localhost" nicht mehr, um z.B. root das Recht zu geben, den X Server eines Users zu benutzen. Da der Befehl, der das jetzt bewirkt, mir etwas zu kryptisch war, hab ich mir gedacht, ich mach mir mal ein Scipt dazu.

Das Ganze sieht bis jetzt so aus:

Code: Alles auswählen

 #!/bin/bash

XAUTHPATH=/usr/X11R6/bin/xauth
GREPPATH=/bin/grep

case "$1" in
    "")
        echo "Usage: hostx [current X user]";
        ;;
    *)
        if [ "`$XAUTHPATH merge ~$1/.Xauthority 2>&1 | $GREPPATH -i -e unable -e usage -e merge;`" ]; then
           # following line for testing purposes
            echo "`$XAUTHPATH merge ~$1/.Xauthority 2>&1 | $GREPPATH -i -e unable -e usage -e merge;`";
            echo "User $1 not found";
        else
            echo "Hosted X for current user";
        fi
        ;;
esac
Ich weiß, ist noch nicht wirklich genial, aber wie gesagt: Fange gerade erst an.

Meine Frage lautet: Warum funktioniert das Script nicht, wenn ich einen gültigen Usernamen eingebe? Ich denke, wenn grep einen Leerstring zurückgibt (xauth ohne Fehlermeldung abgelaufen ist), sollte die IF Abfrage doch false liefern, oder nicht? Leider bekomme ich nie ein false zurück, weder bei einem gültigen Usernamen, noch bei einem ungültigen und das obwohl der echo Befehl mir anzeigt, dass der String leer ist.

Hat da jemand eine Ahnung was ich falsch mache?

Danke schonmal für etwaige Antworten und eine Entschuldigung, falls dieser Thread hier nicht angebracht ist.

Schöne Grüße,

Timo

Benutzeravatar
blackm
Moderator und Co-Admin
Beiträge: 5921
Registriert: 02.06.2002 15:03:17
Lizenz eigener Beiträge: MIT Lizenz

Re: Frage zur Bash-Programmierung

Beitrag von blackm » 21.03.2004 23:27:11

the_isz hat geschrieben:ich hoffe ja mal, ich poste hier nicht in die gnadenlos falsche Ecke
Eigentlich hat das mit Smalltalk nicht viel zu tun...
Seit meinem letzen System-Upgrade funktioniert der Befehl "xhost localhost" nicht mehr
Was ist mit

Code: Alles auswählen

xhost +localhost
?

by, Martin
Zuletzt geändert von blackm am 22.03.2004 07:22:54, insgesamt 1-mal geändert.
Schöne Grüße

Martin

Neu im Forum? --> https://wiki.debianforum.de/debianforum ... tensregeln
Log- und Konfigurationsdatein? --> pastebin.php
Forum unterstützen? --> https://wiki.debianforum.de/debianforum.de/Spenden

Benutzeravatar
the_isz
Beiträge: 101
Registriert: 17.11.2003 16:50:27

Beitrag von the_isz » 22.03.2004 00:04:59

OK, dann nochmal sorry und danke für's verschieben :D

Nein, xhost +localhost funktioniert auch nicht:

Code: Alles auswählen

 Xlib: connection to ":0.0" refused by server
Xlib: Invalid MIT-MAGIC-COOKIE-1 key
emacs: Cannot connect to X server :0.
Check the DISPLAY environment variable or use `-d'.
Also use the `xhost' program to verify that it is set to permit
connections from your machine.
Aber mir geht's eigentlich mehr um das Script, als um den Fehler, weil der Befehl

Code: Alles auswählen

xauth merge ~user_who_runs_X/.Xauthority
ja funktioniert. Ist also rein aus Interesse!

simtin
Beiträge: 122
Registriert: 05.11.2003 21:58:54

Beitrag von simtin » 22.03.2004 00:25:16

Hallo,

ich bin mir da auch oft nicht sicher, darum teste ich das meist mal einfach so in der Konsole.

Code: Alles auswählen

[  ]; echo 'whatever'
liefert beispielweise output, also wird eine leere Zeichenkette auch true gewertet.

Was haelst du davon, zuerst einfach dein grep auszufuehren und dann den exit-Status abzufragen? Wenn etwas gefunden wurde ist dieser 0, ansonsten irgendwas ungleich 0.

Also in etwa so:

Code: Alles auswählen

$GREPPATH ...
if [ $? -eq 0 ]; then
  echo "added";
else
  echo "not added";
fi
Ciao

Benutzeravatar
the_isz
Beiträge: 101
Registriert: 17.11.2003 16:50:27

Beitrag von the_isz » 22.03.2004 02:13:55

Hi simtin,

also die Idee is ja nicht schlecht, aber ich glaube, ich habe im Moment ein schwierigeres Problem, das sich durch Deinen Vorschlag auch nicht lösen lässt:

Ich habe das Script zu Testzwecken nochmal etwas vereinfacht:

Code: Alles auswählen

#!/bin/bash

XAUTHPATH=/usr/X11R6/bin/xauth
GREPPATH=/bin/grep

case "$1" in
    "")
	echo "Usage: hostx [current X user]";
	;;
    *)
	TEST=`$XAUTHPATH merge ~$1/.Xauthority 2>&1`;
	if [ "$TEST" ]; then
	    echo x"`$XAUTHPATH merge ~$1/.Xauthority 2>&1 | $GREPPATH -i -e unable -e usage -e merge;`"x;
	    echo "User $1 not found";
	else
	    echo "Hosted X for current user";
	fi
	;;
esac
Das Problem ist, dass selbst für korrekte Eingaben beim Ablauf des Programms Fehler auftreten und das obwohl die Syntax korrekt ist!

So bekomme ich zum Beispiel bei Eingabe des korrekten User Namens (rincewind) folgende Fehlermeldung:

Code: Alles auswählen

hostx rincewind
x/usr/X11R6/bin/xauth: (argv):1:  merge:  unable to open file ~rincewind/.Xauthorityx
User rincewind not found
Während die Eingabe

Code: Alles auswählen

xauth merge ~rincewind/.Xauthority
ohne Fehler abläuft.

Auch folgende Eingabe ergibt die gleiche Fehlermeldung:

Code: Alles auswählen

~>TEST=rincewind
~> xauth merge ~$TEST/.Xauthority
xauth: (argv):1:  merge:  unable to open file ~rincewind/.Xauthority
Anscheinend stimmt da was mit der Auswertung des Parameters in dem Programmaufruf irgendwas nicht, aber was bloß?

Hat jemand so etwas schon erlebt?

Benutzeravatar
zyta2k
Beiträge: 2446
Registriert: 14.03.2003 09:18:00
Kontaktdaten:

Beitrag von zyta2k » 22.03.2004 09:24:07

Was machst du denn da ??

Code: Alles auswählen

~$1/.Xauthority 2>&1
~username/.Xauth... geht IMHO nicht, da ~ für das Home des aktuellen benutzers steht.

Ändere das in

Code: Alles auswählen

/home/$1/.Xauthority 2>&1
Greetz

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 22.03.2004 10:13:09

Hi,

ohne jetzt mal auf das Script selber eingehen zu wollen, aber wenn du z.B. in einem Script die Environment Variable PATH veraenderst, ist die Aenderung nach Scriptende weg, es sei denn das du das Script "gesource'st" hast, also

Code: Alles auswählen

source myscript.sh
oder

Code: Alles auswählen

. myscript.sh
Wie sich das mit xauth verhaelt, weiss ich nicht. Nichts desto trotz bleibt dei Fehler nach wie vor bestehen, den sehe ich mir spaeter nochmal an, dafuer habe ich im Moment keine Zeit.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
the_isz
Beiträge: 101
Registriert: 17.11.2003 16:50:27

Beitrag von the_isz » 22.03.2004 11:57:15

zyta2k hat geschrieben:Was machst du denn da ??

~username/.Xauth... geht IMHO nicht, da ~ für das Home des aktuellen benutzers steht.

Ändere das in

Code: Alles auswählen

/home/$1/.Xauthority 2>&1
Greetz
Oooohh, natürlich!

Damit ist das Problem natürlich gelöst.

Aber eine Frage hätte ich da noch:

Warum ist die Ausgabe des Programms denn dann korrekt? Also ich meine

Code: Alles auswählen

xauth merge ~rincewind/.Xauthority
funktioniert ja auch einwandfrei, da "~rincewind" für das Home-Verzeichnis des Users rincewind steht. Wie will die Bash denn da "~$1" auswerten? Etwa z.B. zu "/home/root/rincewind", oder was?

Aber auf jeden Fall vielen Dank erstmal, das hat geholfen.

Benutzeravatar
zyta2k
Beiträge: 2446
Registriert: 14.03.2003 09:18:00
Kontaktdaten:

Beitrag von zyta2k » 22.03.2004 12:14:49

the_isz hat geschrieben: Aber eine Frage hätte ich da noch:

Warum ist die Ausgabe des Programms denn dann korrekt? Also ich meine

Code: Alles auswählen

xauth merge ~rincewind/.Xauthority
funktioniert ja auch einwandfrei, da "~rincewind" für das Home-Verzeichnis des Users rincewind steht. Wie will die Bash denn da "~$1" auswerten? Etwa z.B. zu "/home/root/rincewind", oder was?
ämm. Das kann ich dur auch nicht sagen. Für mich ist das konstrukt ~username sehr suspekt. Wusste nicht das sowas geht :?

Benutzeravatar
the_isz
Beiträge: 101
Registriert: 17.11.2003 16:50:27

Beitrag von the_isz » 22.03.2004 12:50:56

zyta2k hat geschrieben:Für mich ist das konstrukt ~username sehr suspekt. Wusste nicht das sowas geht :?
Cool, dann hast Du ja auch was gelernt bei der Sache :P

Probier's mal aus, die Bash macht dafür auch auto-completition. Ich nutze das ständig!

Grüße,

Timo

Antworten