Sh beendet sich nach erstem Befehl

Hallo

Habe mit

mkfifo -m 666 pipe1

eine Pipe angelegt. Dann habe ich in einem Terminalfenster

sh pipe1

eingegeben und in einem anderen

echo ls \> pipe1

Im ersten Terminalfenster wird der Verzeichnisinhalt ausgebeben, allerdings beendet sich sh dabei. Ich möchte aber, dass dieses sh weiterläuft und weitere Befehle über die Pipe annimmt. Was kann ich da machen?

Johannes

Hallo Johannes

Habe mit

mkfifo -m 666 pipe1

eine Pipe angelegt. Dann habe ich in einem Terminalfenster

sh pipe1

eingegeben und in einem anderen

echo ls > pipe1

Im ersten Terminalfenster wird
der Verzeichnisinhalt ausgebeben, allerdings beendet sich sh
dabei. Ich möchte aber, dass dieses sh weiterläuft und weitere
Befehle über die Pipe annimmt. Was kann ich da machen?

vielleicht hilft nohup weiter, siehe u.a. hier
http://www.linux-ag.de/linux/LHB/node90.html
oder eben man nohup

Aber was machst Du da überhaupt?

echo ls

gibt doch, zumindest in der bash, nur ls aus, vielleicht hast Du

echo `ls`

geschrieben?
Aber auch so erschliesst sich mir der Sinn nicht ganz. Wozu diese von Hand eingerichtete Pipe? Ginge ein

ls | irgendwas

nicht auch? Entschuldige die vielen Fragen (mehr als Antworten), aber das interessiert mich einfach.

Viele Grüsse
Klaus Bernstein

Hallo

Sinn des ganzen ist, dass ich über ICQ eine Art Telnet basteln will. Dazu verwende ich mICQ, welches bei jeder eingehenden Nachricht ein Script aufruft. Das Script soll die empfangene Nachricht in die Pipe schreiben, sh soll den Befehl ausführen und in eine weitere Pipe schreiben (die war jetzt noch nicht dabei). Aus dieser Pipe liest ein im Hintergrund laufendes Script die Ausgaben und schickt sie über ICQ zurück.

Ich glaube, sh sieht die pipe als Schellscript an, findet ein EOF und beendet sich. sh soll die pipe aber als Standardeingabe verstehen. Ein sh

Hallo Johannes,

Sinn des ganzen ist, dass ich über ICQ eine Art Telnet basteln
will. Dazu verwende ich mICQ, welches bei jeder eingehenden
Nachricht ein Script aufruft. Das Script soll die empfangene
Nachricht in die Pipe schreiben, sh soll den Befehl ausführen
und in eine weitere Pipe schreiben (die war jetzt noch nicht
dabei). Aus dieser Pipe liest ein im Hintergrund laufendes
Script die Ausgaben und schickt sie über ICQ zurück.
Ich glaube, sh sieht die pipe als Schellscript an, findet ein
EOF und beendet sich. sh soll die pipe aber als
Standardeingabe verstehen. Ein sh

Danke für die Links.
Jetzt hab ich das so:

#!/bin/sh

verz=$(pwd)/$(dirname $0)
echo $verz

while [true]
do
#read comm & ${verz}/out
done

Allerdings geht das nur, wenn immer nur eine Zeile nach in geschrieben wird. Sind es mehrere Zeilen, werden die Zeilenumbrüche beim Speichern in $comm zu Leerzeichen umgewandelt. Ich hab es auch mit read statt cat probiert (auskommentiert). Dann wird aber immer nur die erste Zeile gelesen, der Rest geht verloren. Wie kann ich Zeilenumbrüche in eine Variable speichern?

Hallo Johannes,

Allerdings geht das nur, wenn immer nur eine Zeile nach in
geschrieben wird. Sind es mehrere Zeilen, werden die
Zeilenumbrüche beim Speichern in $comm zu Leerzeichen
umgewandelt. Ich hab es auch mit read statt cat probiert
(auskommentiert). Dann wird aber immer nur die erste Zeile
gelesen, der Rest geht verloren. Wie kann ich Zeilenumbrüche
in eine Variable speichern?

Ich nehme an, Du meinst den Zeilenumbruch hinter dem letzten Wort in der Zeile. Ob es was bringt, weiss ich jetzt nicht, aber Du kannst ja mal mit der bash-Variablen IFS experimentieren. Sie bestimmt, welche Zeichen als Worttrenner benutzt werden, und das sind in der Regel Leerzeichen, Tabulatur und Newline, so dass z.B. Newline natürlich nie mit zum Wort gehört. Wenn Du jetzt IFS nur auf Leerzeichen und Tab setzt, dann würde ein Newline mit zum Wort gerechnet werden.
Hier (im Abschnitt „Aufspaltung in Wörter“) stehen ein paar Erläuterungen und Beispiele dazu:
http://www-user.tu-chemnitz.de/~hot/unix_linux_werkz…
Ob´s dir was nützt, musst Du mal selber ausprobieren.

Viel Erfolg
Klaus Bernstein

Also konkret geht es um folgendes:

echo "1
2"
echo $(echo "3
4")

liefert mir

1
2
3 4

Ich hätte aber gern, dass die 4 auf einer neuen Zeile steht. Was mach ich da falsch? Ich habe da noch ein anderes Script, welches von mICQ mit Parametern aufgerufen wird und da liefert

echo $7

eine mehrzeilige Ausgabe. Also muss es ja gehen.

Johannes

Hallo Johannes,

wie waere es mit richtigem Quoting:

\> echo "$(echo "3
4")"
3
4

gruss
bernhard

Danke

> echo „$(echo „3
4“)“

Ich hatte es schon mit

\> echo "$(echo \"3
4\")"

versucht, weil ich die Auswertungsreihenfolge nicht beachtet hatte.

Jetzt hab ich nur noch ein Problem.
Ich möchte den Inhalt der 2. Pipe nach scripting kopieren.

echo msg xxxxxxxxx \>\> ./scripting
cat pipe2 \>\> ./scripting
echo . \>\> ./scripting

Allerdings muss ich dabei Punkte und Rauten, die allein auf einer Zeile stehen, codieren, da diese als Steuerzeichen gelten. Wie geht das am besten?

Hallo,

Danke

Bitte sehr.

Allerdings muss ich dabei Punkte und Rauten, die allein auf
einer Zeile stehen, codieren, da diese als Steuerzeichen
gelten. Wie geht das am besten?

Ich hoffe, du meinst Zeilen, die ausser dem Sonderzeichen ‚.‘ oder ‚#‘ nur noch ein Zeilenende (Newline) enthalten.

Dann täte es ein nachgeschaltetes

... kommando, das was ausgibt ... | sed 's/^\.$/Punkt/; s/^#$/Raute/'

Ersetzungsstrings (Punkt/Raute) an deinen Bedarf anpassen.

gruss
bernhard

prima owT
.