Bash: zuwenig Dateideskriptoren
Hallo, wie kann man die Anzahl der Dateideskriptoren erhöhen? $ echo "Hallo Welt" 1>&3 bash: 3: Ungültiger Dateideskriptor Der Hintergrund meiner Frage ist folgendes Problem: Ich rufe ein Skript folgendermaßen auf: MeinSkript.sh 1>ErsteNamedPipe 2>ZweiteNamedPipe Innerhalb von MeinSkript.sh steht folgendes: echo "Das geht mittels StdOut in die erste Pipe" echo "Das geht mittels StdErr in die zweite Pipe" 1>&2 MeinSkript.sh soll also mehrere Named Pipes mit Ausgaben "füllen". Mit bis zu 2 Named Pipes (mittels StdOut und StdErr) scheint dies ja zu funktionieren, aber wie kann ich deren Anzahl erhöhen? Ralph
Hallo, On Fri, 27 Jun 2003, Ralph Müller schrieb:
wie kann man die Anzahl der Dateideskriptoren erhöhen?
$ echo "Hallo Welt" 1>&3 bash: 3: Ungültiger Dateideskriptor
Dieser Fehler hat eine andere Ursache. "3" ist ungueltig, weil nicht mit einer Datei verknuepft. 0, 1 und 2 sind nur deshalb gueltig, weil dies die Standarddeskriptoren der standardmaessig geoeffneten Dateien stdin, stdout und stderr sind. Also musst du selber eine Datei oeffnen bzw. den Deskriptor anlegen. exec 3>&1 legt den Descriptor '3' an und leitet ihn auf /dev/stdout, exec 3>/dev/null legt ihn auf /dev/null. Fuer weiterer Beispiele siehe den Begin eines beliebigen configure-script von automake/autoconf.
Der Hintergrund meiner Frage ist folgendes Problem:
Ich rufe ein Skript folgendermaßen auf: MeinSkript.sh 1>ErsteNamedPipe 2>ZweiteNamedPipe
Innerhalb von MeinSkript.sh steht folgendes: echo "Das geht mittels StdOut in die erste Pipe" echo "Das geht mittels StdErr in die zweite Pipe" 1>&2
MeinSkript.sh soll also mehrere Named Pipes mit Ausgaben "füllen". Mit bis zu 2 Named Pipes (mittels StdOut und StdErr) scheint dies ja zu funktionieren, aber wie kann ich deren Anzahl erhöhen?
exec 3>/named_pipe_eins exec 4>/named_pipe_zwei exec 5>/named_pipe_drei .... Alternativ: exec 1>/named_pipe_eins exec 2>/named_pipe_zwei exec 3>/named_pipe_drei exec 4>/named_pipe_vier exec 5>/named_pipe_fuenf .... Damit biegst du aber die Ausgabe von z.B. "echo blubb" schon in die named_pipe_eins um und Fehlermeldungen landen in _zwei... Ob das gewollt ist musst du wissen. ==== aus 'help exec' ==== exec: exec [-cl] [-a name] file [redirection ...] Exec FILE, replacing this shell with the specified program. If FILE is not specified, the redirections take effect in this shell. ==== Der letzte Halbsatz ist der wichtige ;) In man -P'less "+/Duplicating File"' bash steht noch ein wenig mehr dazu... -dnh -- 141: Meinungsaustausch "Meinungsaustausch" heißt aber nicht, daß jemand mit seiner Meinung in die Diskussion hineingeht und mit Deiner wieder herausgeht. (Michael Ottenbruch)
Hallo,
* David Haller
exec 3>/named_pipe_eins
Habe jetzt eine Weile experimentiert. Mit "normalen" Dateien funktioniert das bestens, nur ausgerechnet mit Named Pipes bei mir nicht: Wenn ich exec 3>/named_pipe_eins in der Konsole eingebe (natürlich bei entsprechend existierender Named Pipe), dann kehrt der Prompt nicht zurück. [Suse 7.0, Bash 2.04.0(1)-release] Wenn ich ein " &" hinter den o.g. exec-Aufruf dranhänge, dann kehrt der Prompt zwar zurück, aber es erscheint beim Testen mit "echo HalloWelt 1>&3" (in derselben Shell) wieder die in meiner ursprünglichen Frage-Mail erwähnte Fehlermeldung mit dem "ungültigen Dateideskriptor". Wenn ich ein "exec 3>/StinknormaleDatei" mache, und anschließend versuche der Bash mittels "rm /StinknormaleDatei" und "mkfifo /StinknormaleDatei" eine Pipe unterzujubeln, dann geht die Ausgabe von einem "echo HalloWelt 1>&3" irgendwo ins Nirvana.
man -P'less "+/Duplicating File"' bash
Da steht zwar betreffend "[n]>&word", daß "If the digits in word do not specify a file descriptor open for output, a redirection error occurs." Da eine Pipe m.E. "offen für Output" ist, sollte es doch eigentlich mit Named Pipes funktionieren. Tut es aber irgendwie nicht.(?) Vielleicht habe ich aber auch irgendwo noch ein Denkfehler meinerseits drin. Ralph
Hallo, On Mon, 30 Jun 2003, Ralph Müller schrieb:
* David Haller
schrieb: [ Spannende Schilderung des Hintergrunds von Dateideskriptoren ] exec 3>/named_pipe_eins
Habe jetzt eine Weile experimentiert. Mit "normalen" Dateien funktioniert das bestens, nur ausgerechnet mit Named Pipes bei mir nicht:
Wenn ich exec 3>/named_pipe_eins in der Konsole eingebe (natürlich bei entsprechend existierender Named Pipe), dann kehrt der Prompt nicht zurück. [Suse 7.0, Bash 2.04.0(1)-release]
Bei mir geht das [SuSE 6.2, bash 2.03.0(1)-release]. dh@slarty[3]: /tmp/test4 (0)$ mkfifo named_pipe_eins dh@slarty[3]: /tmp/test4 (0)$ exec 3>./named_pipe_eins dh@slarty[1]: ~ (0)$ cat /tmp/test4/named_pipe_eins dh@slarty[3]: /tmp/test4 (0)$ echo 'Hallo Welt!' >&3 [im xterm mit dem cat] Hallo Welt! dh@slarty[3]: /tmp/test4 (0)$ exec 3>&- [im xterm mit dem cat] dh@slarty[1]: ~ (0)$ Wie sind bei dir die Rechte der "named pipe"? Hm. Bei mit klappt's jetzt auf einmal auch nicht mehr -- aber ich weiss wie's dann geht: Du musst dafuer sorgen, dass die Pipe auch gelesen wird (z.B. durch ein cat)... Dann kehrt das 'open' der Pipe, das beim 'exec 3>./named_pipe' ausgefuehrt wird auch zurueck und du bekommst deinen Prompt wieder.
Wenn ich ein "exec 3>/StinknormaleDatei" mache, und anschließend versuche der Bash mittels "rm /StinknormaleDatei" und "mkfifo /StinknormaleDatei" eine Pipe unterzujubeln, dann geht die Ausgabe von einem "echo HalloWelt 1>&3" irgendwo ins Nirvana.
Nein, die geht in /StinknormaleDatei, denn diese ist nachwievor von der bash geoeffnet. Erst wenn du in der bash mit exec 3>&- die Datei schliesst oder die bash beendest wird /StinknormaleDatei geloescht. Siehe 'man 2 unlink': unlink deletes a name from the filesystem. If that name was the last link to a file and no processes have the file open the file is deleted and the space it was using is made available for reuse. Entscheidend ist der Satz "and no processes have the file open". Achso: unlink ist die Systemfunktion, die letztlich verwendet wird (u.a. eben von 'rm'). -dnh -- Stimmt, MS-Benutzer zu verhohnepiepeln ist eigentlich so unwaidmaennisch wie tote Schafe zu treten. Trotzdem sehr angenehm wollig-warm im Tritt. -- Andreas Kabel am 16.05.2000 in dan-am
On Mon, 30 Jun 2003 at 16:42 (+0200), Ralph Müller wrote:
Hallo,
* David Haller
schrieb: [ Spannende Schilderung des Hintergrunds von Dateideskriptoren ] exec 3>/named_pipe_eins
Habe jetzt eine Weile experimentiert. Mit "normalen" Dateien funktioniert das bestens, nur ausgerechnet mit Named Pipes bei mir nicht:
Wenn ich exec 3>/named_pipe_eins in der Konsole eingebe (natürlich bei entsprechend existierender Named Pipe), dann kehrt der Prompt nicht zurück. [Suse 7.0, Bash 2.04.0(1)-release]
Wahrscheinlich wartet der exex, bis die in die Pipe geschobenen
Daten abgeholt werden. Setze auf einem 2. Fenster mal folgendes ab:
while read a
Hallo Leute, Am Freitag, 27. Juni 2003 20:51 schrieb Ralph Müller:
wie kann man die Anzahl der Dateideskriptoren erhöhen?
Ich würde es zwar eher als "Ausgabekanäle" bezeichnen ;-) aber trotzdem: $ exec 3>&1
$ echo "Hallo Welt" 1>&3
bringt dann nicht mehr
bash: 3: Ungültiger Dateideskriptor
sondern Hallo Welt ;-) Ach, kann "richtiges" Quoting so schön sein *g* BTW und ungetestet: ein "exec 3>datei" sollte wohl auch funktionieren, stdout und stderr lassen sich wohl ebenso umleiten ;-) Gruß Christian Boltz --
....Ommmmmm ....Ommmmmm .....Ommmmmm Pendel ----Pendel-----Pendel------ Mensch Axel: Sonst machst Du das doch mit der Glaskugel. Ist die schon wieder in der Spülmaschine? [Axel Lindlau u. Volker Kroll in suse-linux]
Hallo, On Fri, 27 Jun 2003, Christian Boltz schrieb:
Am Freitag, 27. Juni 2003 20:51 schrieb Ralph Müller:
wie kann man die Anzahl der Dateideskriptoren erhöhen?
Ich würde es zwar eher als "Ausgabekanäle" bezeichnen ;-)
"Dateideskriptor" ist schon korrekt. AFAIK korrespondieren die auch mit den real von der bash verwendeten... Zum Verstaendnis traegt deine Bezeichnung aber mehr bei...
Ach, kann "richtiges" Quoting so schön sein *g*
Jep ;)
BTW und ungetestet: ein "exec 3>datei" sollte wohl auch funktionieren,
Tut es. dh@slarty[3]: ~ (0)$ (
exec 1>/dev/null echo "Hallo Welt" echo "Hallo Welt" >&2 ) Hallo Welt dh@slarty[3]: ~ (0)$
stdout und stderr lassen sich wohl ebenso umleiten ;-)
Jup. s.o. und meine andere Mail. -dnh -- [about the "M$ Jet Engine"] But it's a very appropriate name, in that a jet engine is something that both sucks and blows. -- Paul Tomblin ... and if stuff gets inside, it either gets utterly mashed or causes the engine to disintegrate. -- Rik Steenwinkel
* David Haller schrieb am 28.Jun.2003:
On Fri, 27 Jun 2003, Christian Boltz schrieb:
Am Freitag, 27. Juni 2003 20:51 schrieb Ralph Müller:
wie kann man die Anzahl der Dateideskriptoren erhöhen?
Ich würde es zwar eher als "Ausgabekanäle" bezeichnen ;-)
"Dateideskriptor" ist schon korrekt. AFAIK korrespondieren die auch mit den real von der bash verwendeten... Zum Verstaendnis traegt deine Bezeichnung aber mehr bei...
Dann aber Ein/Ausgabekanäle, Dateideskriptoren können ja auch Eingabekanäle sein. Bernd -- Alle meine Signaturen sind rein zufällig und haben nichts mit dem Text oder dem Schreiber zu tun, dem ich antworte. Falls irgendwelche Unrichtigkeiten dabei sein sollten, so bedauere ich das. Es wäre nett, wenn Du mich benachrichtigen würdest. |Zufallssignatur 0
participants (5)
-
B.Brodesser@t-online.de
-
Christian Boltz
-
David Haller
-
Jan.Trippler@t-online.de
-
Ralph Müller