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
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