Hi,
mal wieder was zur Shell (bash)
Gegeben sei eine Pipe, über die ein text kommt, z.B. "BBB". Das könnte so aussehen:
echo BBB |
und ist NICHT änderbar. Ich will nun irgendwas HINTER diese Pipe schreiben, womit vor den Text "BBB\n" noch eine Zeile mit "AAA\n" eingefügt wird. Insgeamt soll das also so aussehen:
$ echo BBB | ???????? AAA BBB $
Bisher habe ich es nur mit einem zusätzlichen file (darf nicht sein) oder awk (soll nicht sein :) geschafft:
mit file:
$ echo AAA > tmpfile $ echo BBB | cat tmpfile - AAA BBB $
mit awk:
$ echo BBB | awk 'BEGIN{printf("AAA\n")};{print}' AAA BBB $
Ist das irgendwie shellintern machbar?
Reinhard
On Wed Aug 08, 2001 at 16:31:36 +0200, Reinhard Foerster wrote:
$ echo BBB | ???????? AAA BBB $
Ist nur mit Shell-interna:
$ echo BBB | ( read a && echo -e "AAA\n$a" ) AAA BBB
Adam
Hi Reinhard,
On Wed, Aug 08, 2001 at 16:31:36 +0200, Reinhard Foerster wrote:
Gegeben sei eine Pipe, über die ein text kommt, z.B. "BBB". Das könnte so aussehen: echo BBB |
und ist NICHT änderbar. Ich will nun irgendwas HINTER diese Pipe schreiben, womit vor den Text "BBB\n" noch eine Zeile mit "AAA\n" eingefügt wird. Insgeamt soll das also so aussehen: $ echo BBB | ???????? AAA BBB
echo BBB | (echo AAA ; cat)
Einfach den Kram an eine Subshell pipen. Oder versteh ich was falsch?
bye, Chris
On Wed, Aug 08, 2001 at 04:49:27PM +0200, Christian Perle wrote:
echo BBB | (echo AAA ; cat)
klappt :) Mir ist noch unklar, warum in diesem Fall BBB bei cat noch ankommt, bei
echo BBB | echo AAA ; cat
aber nicht. Genauer: Wieso bekommen in der Subshell BEIDE Kommandos die Pipe als input? Wer vonden beiden die BBB zuerst liest, hat sie. Bei
echo BBB | (cat ; cat)
gibt das erste cat die BBB aus.
Reinhard
On Wed, Aug 08, 2001 at 05:27:20PM +0200, Reinhard Foerster wrote:
On Wed, Aug 08, 2001 at 04:49:27PM +0200, Christian Perle wrote:
echo BBB | (echo AAA ; cat)
[1]
Mir ist noch unklar, warum in diesem Fall BBB bei cat noch ankommt, bei
echo BBB | echo AAA ; cat
[2]
aber nicht. Genauer: Wieso bekommen in der Subshell BEIDE Kommandos die Pipe als input? Wer vonden beiden die BBB zuerst liest, hat sie. Bei
echo BBB | (cat ; cat)
[3]
gibt das erste cat die BBB aus.
Im Fall [2] werden zwei separate Prozesse ausgeführt, die nix miteinander zu tun haben, nämlich "echo BBB | echo AAA" und "cat". Die Pipe verbindet stdout von "echo BBB" mit stdin von "echo AAA". Im Fall [1] wird stdout von "echo BBB" erst mit "echo AAA" und dann mit "cat" verbunden (eigentlich werden die sie vom Vaterprozeß erben [siehe "double fork"]). Wenn aber im Fall [3] in der Klammer zwei "cat" stehen, dann ist beim zweiten cat die Pipe schon leer. Die Klammer legt also die Precedence von '|' und ';' fest.
Eric
On Wed, Aug 08, 2001 at 05:49:15PM +0200, Eric Schaefer wrote:
echo BBB | (echo AAA ; cat)
[1]
echo BBB | echo AAA ; cat
[2]
echo BBB | (cat ; cat)
[3]
gibt das erste cat die BBB aus.
Im Fall [2] werden zwei separate Prozesse ausgeführt, die nix miteinander zu tun haben, nämlich "echo BBB | echo AAA" und "cat". Die Pipe verbindet stdout von "echo BBB" mit stdin von "echo AAA".
Yepp, der Fall war mir klar.
Im Fall [1] wird stdout von "echo BBB" erst mit "echo AAA" und dann mit "cat" verbunden (eigentlich werden die sie vom Vaterprozeß erben [siehe "double fork"]). Wenn aber im Fall [3] in der Klammer zwei "cat" stehen, dann ist beim zweiten cat die Pipe schon leer.
MMh. Bevor die subshell per exec startet, wird also der stdin auf die pipe verbogen. Die beiden Kommandos der Subshell erben dann diesen stdin. Thx, ich habe es kapiert. Subshells haben in unserer Eigenbaushell damals irgendwie gefehlt :)
Reinhard
Am Mittwoch, dem 08. August 2001 um 16:31:36, schrieb Reinhard Foerster:
Insgeamt soll das also so aussehen:
$ echo BBB | ???????? AAA BBB
Ist das irgendwie shellintern machbar?
Viel zu einfach! ;-)
$ echo BBB | (echo AAA; cat -)
Torsten
lug-dd@mailman.schlittermann.de