absoluten Pfad einer Datei auf CD bestimmen

Message
Author
carsten
Posts: 25
Joined: 18. Oct 2003 15:22

Re: absoluten Pfad einer Datei auf CD bestimmen

#16 Post by carsten »

> Das richtige CDROM-LW sollte Dein Skript durch Versuch und Irrtum herausfinden koennen. Mir fehlt gerade die Zeit, das
> zusammenzuflicken, also hier nur die Beschreibung:

Hmmm

> Das Skript muss nach
> ...
> cd $pfad
> den aktuellen Verzeichnisnamen mit dem (vorgegebenen) CD-Verzeichnisnamen vergleichen.
> Bei Uebereinstimung kann es losgehen mit ./<praesentation>.
> Bei Nicht-Uebereinstimmung bist Du auf der falschen CD zugange. Dann muss der Vergleich zwischen aktuellem Verzeichnisnamen und dem
> CD-Verzeichnisnamen auf dem naechsten CD-LW wiederholt werden.

Was redest du da? In irgendein verzeichnis wechseln und? Das ist schmarn. Wie gesagt: einen ls-Befehl überprüfen.

> Aber hier noch ein paar Fragen, die Du nach Fertigstellung des Skripts beantworten kannst
> - Woher weisst Du, dass auf dem unbekannten System KDE laeuft mit einem CDROM-Icon? Ich habe sowas nicht (benutze IceWM).

Mounten muss man die CD, da kommt man nicht rum. Da kommt man nicht rum, fertig.

> - Wieso eigentlich muss der absolute Pfad des CD-Verzeichnisses ermittelt werden?

Gute Frage :D Schlechte Programmierung der Präsentation, oder?

(Sorry, dein Post hat niemandem viel gebracht... Dein Ansatz ist ausserdem nicht wirklich zu verstehem)

CU Carsten

Stephan

Re: absoluten Pfad einer Datei auf CD bestimmen

#17 Post by Stephan »

========
Carsten:
========

>Ganz einfach: er liefert zwei Zeilen

>Du musst also jetzt noch das mit mehreren Zeilen implementieren. Vielleicht gibts dafür was, aber normalerweise dürfte ein Zeilenumbruch sein.

wahrscheinlich nein, ich habe gerade mal Folgendes probiert:

[root@localhost cdrom]# test=$(mount)
[root@localhost cdrom]# echo $test
/dev/hdb7 on / type reiserfs (rw) proc on /proc type proc (rw) devpts on /dev/pts type devpts (rw,mode=0620,gid=5) /dev/hdb5 on /boot type ext2 (rw) shmfs on /dev/shm type shm (rw) usbdevfs on /proc/bus/usb type usbdevfs (rw) /dev/fd0 on /media/floppy type vfat (rw,noexec,nosuid,nodev,sync,user=jms) /dev/hdc on /media/dvd type iso9660 (ro,nosuid,nodev,user=jms)

d.h. Variable test enthält keine Zeilenumbrüche, somit dürfte es bei test=$(mount | grep iso9660) ,falls mehrere CD-Rom gemountet sind, analog verhalten.

========
jj:
========

Ich habe schon eine Vorstellung wie ich das richtige CD-LW finden kann, muß aber über die Umsetzung etwas nachdenken, damit ich es nicht falsch ins Skript schreibe.

>weil erst die Variable $dat aufgeloest wird und echo dann #*/ bzw. #*. einfach dranhaengt. Das verhinderst Du mit den Klammern

Danke, wußte ich nicht.

>Woher weisst Du, dass auf dem unbekannten System KDE laeuft mit einem CDROM-Icon? Ich habe sowas nicht (benutze IceWM).

Das weiß ich nicht... Ich habe hier schon irgendwo erwähnt das ich Linux-Anfänger bin, ich sollte vielleicht sagen das ich von Linux keine Ahnung habe. Mein Gedankengang war folgender:
-ich habe eine Präsentation unter Windows erstellt (mit Autorensystem)
-ich sah keine Möglichkeit ähnliches unter Linux zu tun, da ich bisher nichts mit Linux gemacht habe und so etwas in HTML zu schreiben bietet zu wenig Möglichkeiten
-ich stieß nun darauf das es von Macromedia einen Flashplayer auch für Linux gibt und ich damit auch *.swf in Projektordateien kompillieren kann (Projektor meint ein Programm welches ohne Installation des Flashplayers meine Flash-Datei abspielt, Standalone nicht mittels Browser-Plugin)
-somit kann ich nun meine Präsentation in Flash programmieren und unter Linux laufen lassen, ohne das ich auf dem Zielrechner etwas installieren muß
-da ich zumindest weiß das es unter Linux keinen Autostart wie unter Windows für die CD gibt (ich habe aber mal gelesen das es unter Mandrake so etwas doch geben soll??), hielt ich es für das beste in das Wurzelverzeichnis der CD ein Script zu legen, welches Start heißt, in der Hoffnung das der Nutzer meiner CD dieses Skript findet und startet

Hast Du eine bessere Idee?

Wieso eigentlich muss der absolute Pfad des CD-Verzeichnisses ermittelt werden?

Die kompillierte Flash-Datei wertet intern den aktuellen Pfad aus unter welchem sie läuft, unter Windows kann man sie direkt starten (ich muß natürlich die *.swf für Windows und Linux separat kompillieren). Unter Linux werden jedoch ausführbare Dateien, welche von einem Welchseldatenträger gestartet werden stets in Homeverzeichnis des aktuellen Benutzers ausgeführt, ich hoffe ich habe das richtig formuliert...



Ich habe heute keine Zeit mehr, werde mir jedoch überlegen wie ich den oben beschriebenen Ausdruck in dem Skript auswerten kann und das fertige Skript dann hier posten.


Gruß
Stephan

jj

Re: absoluten Pfad einer Datei auf CD bestimmen

#18 Post by jj »

@ Carsten
> Was redest du da? In irgendein verzeichnis wechseln und? Das ist schmarn. Wie gesagt: einen ls-Befehl überprüfen.

Stephan hat doch (nur noch) das Problem, dass auf dem unbekannten System vielleicht gerade mehrere CDROMs gemountet sind (u.a. seine eigene)., und er dementspr. durch mount | grep iso9660 *mehrere* Laufwerke angezeigt bekommt.
Um den Pfad zur *richtigen* CD festzulegen, muss sein Skript also ueberpruefen, ob es den Pfad der *richtigen* CD ermittelt hat, sonst kommt seine Praesentation ja nicht zurecht.

Sein Skript wechselt unmittelbar vor Start der Prasentation auf das CD-Verzeichnis, indem seine Praesentation liegt (in seinem Skript durch cd $pfad). Um bei Existenz und aktuellem Betrieb von mehreren CDROM-Laufwerken auszuschliessen, dass er mit seinem absoluten Pfad auf der falschen CD gelandet ist, soll das aktuelle CDROM-Verzeichnis mit dem gemeinten CDROM-Verzeichnis verglichen werden.
Was ist daran Schmarrn?

Mit ls geht das auch: Wenn ihm nach cd $pfad nicht (auch) seine Praesentation angezeigt wird, duerfte ihn $pfad auf die falsche CD gefuehrt haben.

> Mounten muss man die CD, da kommt man nicht rum. Da kommt man nicht rum, fertig.

Du sagst es, weisse Taube. Lies Dir doch Stephans postings durch, da ist mehrmals vom Anklicken die Rede. Da seine Praesentation auf jedem unbekannten System laufen soll, darf er nicht notwendig davon ausgehen, dass dort KDE installiert ist bzw. irgendwas zum Klicken.

gruss
jj

jj

Re: absoluten Pfad einer Datei auf CD bestimmen

#19 Post by jj »

@ Stephan

> Unter Linux werden jedoch ausführbare Dateien, welche von einem Welchseldatenträger gestartet werden stets in Homeverzeichnis des aktuellen Benutzers ausgeführt

Bist Du sicher?
Du meinst, Deine Praesentation arbeitet im Home-Verzeichnis, muss aber auf die CD zugreifen und braucht dafuer den absoluten Pfad?
Na was soll's, von dem Flashplayer-Kramn habe ich keine Ahnung. Ich wuerde als erstes probieren, in das richtige CD-Verzeichnis zu wechseln und die Praesentation zu starten, aber das hast Du sicherlich auch schon versucht.

Viel Erfolg.

gruss
jj

Stephan

Re: absoluten Pfad einer Datei auf CD bestimmen

#20 Post by Stephan »

So, nun habe ich es fast komplett.
Das folgende Skript enthält zum Testen derzeitig noch Echo-Zeilen.

====================================================================================================
#! /bin/bash
echo ===Neustart=== >> test.txt
# die folgende Zeile muß in endgültigen Skript lauten: gesamt=$(mount | grep iso9660)
gesamt=$(mount)
A=${gesamt#*on}
B=${A#*on}

while [ "$B" != "$A" ]; do

pfad=${A%%type*}

#===================
# *** Hier muß vorhandensein der Datei geprüft werden
#===================

echo $pfad >> test.txt
A=$B
B=${A#*on}

done

# das folgende ist nicht so elegant, aber nötig da ich nicht weiß wie ich das anders machen soll
pfad=${A%%type*}

#===================
# *** Hier muß vorhandensein der Datei geprüft werden
#===================

echo $pfad >> test.txt
====================================================================================================

In der Datei test.txt steht nach abarbeiten des Skripts folgendes:

===Neustart===
/
/proc
/dev/pts
/boot
/dev/shm
/proc/bus/usb
/media/dvd

Das Skript liefert somit ein richtiges Ergebnis weil:

jms@linux:~/Desktop> mount
/dev/hdb7 on <b>/</b> type reiserfs (rw)
proc on <b>/proc</b> type proc (rw)
devpts on <b>/dev/pts</b> type devpts (rw,mode=0620,gid=5)
/dev/hdb5 on <b>/boot</b> type ext2 (rw)
shmfs on <b>/dev/shm</b> type shm (rw)
usbdevfs on <b>/proc/bus/usb</b> type usbdevfs (rw)
/dev/hdc on <b>/media/dvd</b> type iso9660 (ro,nosuid,nodev,user=jms)
jms@linux:~/Desktop>


Nun brauchte ich ein Kommando welches das Vorhandensein der Datei prüft und an den Stellen:

#===================
# *** Hier muß vorhandensein der Datei geprüft werden
#===================

stehen muß. Dieses Kommando sollte als Rückgabe nur 1 für Datei vorhanden und 0 für nicht vorhanden liefern (oder andere Ja/Nein Information, ich habe bisher nichts geeignetes gefunden).

Könnt Ihr mir da weiterhelfen?
Außerdem: Gibt es bei einem Shellskript keinen GOTO-Befehl? Was kann ich als Ersatz für GOTO verwenden?


Gruß
Stephan

Stephan

Re: absoluten Pfad einer Datei auf CD bestimmen

#21 Post by Stephan »

So, das Skript ist fertig und funktioniert auch:


#! /bin/bash
# mein Programm heißt test2 (und ist im Wurzelverzeichnis der CD)
xxx=/test2
# $(mount) würde auch funktionieren, wenn test2 nur einmal vorhanden ist
gesamt=$(mount | grep iso9660)

A=${gesamt#*on}
B=${A#*on}

while [ "$B" != "$A" ]; do

pfad=${A%% type*}

#=============================================================================
#Vorhandensein der Datei test2 prüfen, wenn vorhanden While-Schleife verlassen
#in das Verzeichnis pfad (Wurzel der CD) wechseln und test2 starten,
#sonst weiterprüfen
#-----------------------------------------------------------------------------
pro=$pfad$xxx
if [ -e $pro ]; then
break
else
echo nichtheraus >> /dev/NULL
fi
#=============================================================================

A=$B
B=${A#*on}

done

# das folgende ist nicht so elegant, aber nötig da ich nicht weiß wie ich das
# anders machen soll

pfad=${A%% type*}

cd $pfad
./test2



Gruß
Stephan

jj

Re: absoluten Pfad einer Datei auf CD bestimmen

#22 Post by jj »

Hallo Stephan,

ich habe auch einen Vorschlag, den ich nicht testen kann, da ich nur ein CD-LW habe. Bin mir auch nicht sicher, ob die Syntax ueberall stimmt.

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">#####################################################
#!/bin/sh

# Alle aktuell gemounteten CDs ermitteln und die Mount-Verzeichnisse rausschneiden
# Ergebnis in var speichern

var=$(mount | grep iso9660 | cut -d " " -f 3)

# Für jedes Element i von $var pruefen, ob die Praesentation gefunden wird
# falls ja, gibt test 0 zurueck, was mit if geprueft wird und ggf die Praesentation
# durch Aufruf des absoluten Pfads startet. Danach ist Schluss.

for i in $var do

if [ -e $i/test2 ]
then
$i/test2
exit
fi
done

</font><hr></pre></blockquote>

gruss
jj

Stephan

Re: absoluten Pfad einer Datei auf CD bestimmen

#23 Post by Stephan »

Hallo jj,

ist ja höchst elegant...
ein kleiner Fehler hat sich eingeschlichen:

<font face="Courier New">for i in $var do > for i in $var; do</font><!--fixed-->

dann funktioniert es bestens, auch mit 2 CD-Rom.


Aber schreib mir doch bitte noch eine Erklärung zu:

<font face="Courier New">cut -d " " -f 3</font><!--fixed-->

Heißt das:
Der aus mount | grep iso9660 resultierende String besteht aus mehreren Zeilen, zerlege jede Zeile in Teilstrings indem " " als Trennzeichen betrachtet wird und gib jeweils den 3.Teilstring (-f 3) aus (bzw. eleminiere alles außer dem jeweils 3.Teilstring) ?


Gruß
Stephan

jj

Re: absoluten Pfad einer Datei auf CD bestimmen

#24 Post by jj »

Hallo Stephan,

> ein kleiner Fehler hat sich eingeschlichen:
War klar, dass irgendwas nicht stimmt. Gestern haben mich fehlende Leerzeichen in <font face="Courier New">[ -e $i/test2 ]</font><!--fixed--> bestimmt ne halbe Stunde gekostet.


>Heißt das:
> Der aus mount | grep iso9660 resultierende String besteht aus mehreren Zeilen, zerlege jede Zeile in Teilstrings indem " " als
> Trennzeichen betrachtet wird und gib jeweils den 3.Teilstring (-f 3) aus (bzw. eleminiere alles außer dem jeweils 3.Teilstring) ?

Gienau!

<font face="Courier New">cut</font><!--fixed--> schneidet Felder aus Zeilen in Textdateien.
Als Trenner zwischen den Feldern ist defaultmaessig TAB eingestellt.
Mit der Option -d ueberschreibst Du das und gibst den Trenner (delimiter) vor, hier ist es mit " " einfach ein Leerzeichen.
Mit der Option -f gibst Du das Feld an, das rausgeschnitten werden soll, hier also das dritte (die Zaehlung beginnt etwas Unix-untypisch tatsaechlich mit 1, nicht mit 0).
Da die Ausgabe von <font face="Courier New">mount</font><!--fixed--> in jeder Zeile durch Leerzeichen getrennte Felder aufweist (und zwar auf jedem Linuxsystem der Welt), wird also aus den (von <font face="Courier New">grep</font><!--fixed--> rausgefischten) Zeilen der Ausgabe von <font face="Courier New">mount</font><!--fixed--> genau das Feld rausgeschnitten, das den Mountpoint angibt.

Das Rausgeschnittene wird in var gespeichert. Mach mal an der Konsole (wahlweise mit einer und zwei CD-ROMs)

<font face="Courier New">$: var=$(mount | grep iso9660 | cut -d " " -f 3)
$: echo $var</font><!--fixed-->

Du siehst, die ermittelten CD-Mountpoints sind in var wie die Elemente einer Liste oder eines Arrays gespeichert.
Also kann man mit <font face="Courier New">for i in $var</font><!--fixed--> weitermachen.

gruss
jj

petameta
prolinux-forum-admin
Posts: 1294
Joined: 14. Feb 2003 13:19

Re: absoluten Pfad einer Datei auf CD bestimmen

#25 Post by petameta »

Also entweder ich hab das Problem falsch verstanden, oder es ist niemand auf eine simple Lösung gekommen:

Die Variable $0 enthält den Dateinamen des Skripts, inklusive kompletten Pfad (einfach mal echo $0 in nem Bash-Skript probieren). Wenn das Skript im Wurzelverzeichnis der CD liegt, is doch alles klar: $0 auslesen, den Pfad rauskopieren, und übergeben.

Stephan

Re: absoluten Pfad einer Datei auf CD bestimmen

#26 Post by Stephan »

Hallo zusammen,

Danke, nochmal an alle für die interessante Dikussion.


@Peta Meta

>Also entweder ich hab das Problem falsch verstanden

Nein, hast Du richtig verstanden

>Die Variable $0 enthält den Dateinamen des Skripts, inklusive kompletten Pfad (einfach mal echo $0 in nem Bash-Skript probieren). Wenn das Skript im Wurzelverzeichnis der CD liegt, is doch alles klar: $0 auslesen, den Pfad rauskopieren, und übergeben

ja, ist tatsächlich so. Danke. Wußte ich als Anfänger aber nicht.


@jj

Danke für die Erläuterung zu cut.

>bestimmt ne halbe Stunde gekostet...

ich bin bei meinem Skript fast verzweifelt an Then/then (Großkleinschreibung bei Linux ist für Windowsanwender immer wieder Falle...)

ach, übrigens:
irgendwo hattest Du mal nachgefragt zu meiner Behauptung das ein Skript vom Wechseldatenträger gestartet immer im Homeverzeichnis des angemeldeten Benutzers läuft, hier ist mein Beispiel (siehe auch Dein Script)


<font face="Courier New">$i/test2</font><!--fixed-->

(hier ist aktueller Pfad <Homeverzeichnis> ; also pwd > Datei (innerhalb des Skripts) würde <Homeverzeichnis> des aktuellen Benutzers in die Datei schreiben)

<font face="Courier New">cd $i
./test2</font><!--fixed-->

(hier ist aktueller Pfad der Pfad in welchem sich mein Programm befindet insofern i den Pfad zu meinem Programm enthält, pwd würde $i liefern)

Dieser Sachverhalt ist das was ich meinte...


Gruß
Stephan

jj

Re: absoluten Pfad einer Datei auf CD bestimmen

#27 Post by jj »

Tja, wusste ich eigentlich auch, aber Brett vorm Kopf. Peta Meta haette sich ja
auch bisschen frueher melden koennen<img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Fertig bist Du dann aber auch noch nicht, denn $0 liefert den Pfad zu Deinem Startskript, also zB

/mnt/cdrom/startskript

Du willst aber den Pfad zu Deiner Praesentation, also

/mnt/cdrom/test2

Um den Mountpoint zu bekommen, muss also auch $0 noch bearbeitet werden, im
Startskript also zB mit dirname (lies man dirname!):
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh

# Mountpoint des CD-Filesytems bestimmen
var=$(dirname $0)

# Praesentation starten
$var/test2</font><hr></pre></blockquote>

Das ist wirklich das mit Abstand einfachste bisher.


Nur aus Neugier nochmal die Frage: Warum muss die Praesentation den Pfad haben? Warum geht nicht einfach ein Klick auf test2?


gruss
jj

Stephan

Re: absoluten Pfad einer Datei auf CD bestimmen

#28 Post by Stephan »

@jj

>Fertig bist Du dann aber auch noch nicht, denn $0 liefert den Pfad zu Deinem Startskript, also zB
>/mnt/cdrom/startskript
>Du willst aber den Pfad zu Deiner Praesentation, also
>/mnt/cdrom/test2

Ja, aber das sich meine Präsentation im Wurzelverzeichnis der CD befindet habe ich nur hier angegeben um die Dikussion zu vereinfachen. In Realität wird sich die Präsentation in einem Unterordner befinden (i.S. /mnt/cdrom/ ... /test2), nur das Skript wird im Wurzelverzeichnis sein (damit der Nutzer der CD es sofort sieht wenn er die CD mountet), der komplette Pfad vom Wurzelverzeichnis (bzw. Mountpunkt) ist mir jedoch bekannt weil ich ja die CD selbst brennen werde.

>Nur aus Neugier nochmal die Frage: Warum muss die Praesentation den Pfad haben? Warum geht nicht einfach ein Klick auf test2?

Mein Programm ist ein Flash-Projektor (kompillierte *.Swf-Datei) aus dieser heraus muß ich andere Dateien aufrufen (z.B. pdf oder html). <i>(Ich kann Dir gerne den Code posten, aber wir diskutieren hier in einer LinuxNewsGroup...)</i>
Mein Programm muß diese Dateien durch relative Pfade aufrufen, da mir zum Zeitpunkt der Erstellung/Kompillierung meines Programms die Absoluten Pfade des Zielsystems nicht bekannt sind (insbesondere Mountpunkt der CD).
Nehmen wir einmal an mein Programm (test2) soll nach Aufruf eine Html-Datei (Datei.html) aufrufen, beide Dateien befinden sich im Wurzelverzeichnis der CD. Nach dem Mounten der CD z.B. in:

<font face="Courier New">/mnt/cdrom/test2</font><!--fixed--> und <font face="Courier New">/mnt/cdrom/Datei.html</font><!--fixed-->

das Programm (test2) ruft nun nachdem es gestartet ist Datei.html auf und zwar mit relativem Pfad. Was passiert:

starte ich (nach mounten der CD) test2 durch anklicken entspricht der Pfad "in welchem Test2 läuft" NICHT etwa dem Pfad

<font face="Courier New">/mnt/cdrom</font><!--fixed--> <b> sondern </b> <font face="Courier New">/home/<aktueller Benutzer></font><!--fixed--> (bzw. auch /root wenn root aktueller benutzer ist)

Die Situation ist definitiv so. Ich habe gelesen das es aus Sicherheitsgründen so ist das ausführbare Dateien (Programme, Skripte etc.) welche nicht installiert sind (also z.B. von CD gestartet werden) immer im Pfad des aktuellen Benutzers laufen. Warum das so ist weiß ich als Linux-Neuling nicht.

also würde nun mein Programm die Datei Datei.html hier suchen:

<font face="Courier New">/home/<aktueller Benutzer>/Datei.html</font><!--fixed-->

aber die Datei wird dort nicht gefunden weil sie ja in:

<font face="Courier New">/mnt/cdrom/Datei.html </font><!--fixed-->

ist.

Ob meine Erklärung von der Formulierung her ("in welchem Test2 läuft") richtig ist weiß ich nicht, aber es passiert genau das was ich beschrieben habe !

Schreibe doch mal folgendes Skript:

<font face="Courier New">#! /bin/bash</font><!--fixed-->
<font face="Courier New">pwd > AusgabePfad.txt</font><!--fixed-->

speichere es irgendwo auf einem Linuxrechner (jedoch NICHT im Homeverzeichnis des aktuellen Benutzers und auch nicht in /root falls root gerade aktueller Benutzer ist). Starte dieses Skript durch anklicken (nicht durch ./Skriptname). Du erhältst die Datei AusgabePfad.txt im Homeverzeichnis des aktuellen Benutzers und in der Datei steht genau der Pfad dieses Homeverzeichnisses. <b>Verstehst Du nun was ich meine?</b>

Das dargelegte gilt nur für <u>ausführbare</u> Dateien und z.B. nicht für Html-Dateien, hier sind relative Links (ohne Probleme mit dem Pfad) möglich!


Gruß
Stephan

jj

Re: absoluten Pfad einer Datei auf CD bestimmen

#29 Post by jj »

> <b>Verstehst Du nun was ich meine?</b>

<b>Jau!</b>
Ich war eigentlich schon in meinem Posting 19.10, 17:59:15 so weit, aber irgendwie hast Du das nie richtig bestaetigt.

gruss
jj

Post Reply