[*nix] stdin en stdout mergen

Pagina: 1
Acties:

  • WildernessChild
  • Registratie: Februari 2002
  • Niet online

WildernessChild

Voor al uw hersenspinsels

Topicstarter
Voor de shell-fanatiekelingen heb ik een interessant probleempje. Ik heb een (groot) aantal programmaatjes die prompts printen en dan invoer lezen. Bijvoorbeeld:
code:
1
2
Geef een getal: <3>
Het kwadraat van 3 is 9

Hier is datgene tussen de < en de > dus datgene wat uit de invoerstream (stdin) komt, en de rest komt uit stdout.

Nu wil ik automatisch output genereren zoals hierboven, dus met de invoerstream en uitvoerstream op de juiste manier 'geritst', en alles wat uit de invoerstream komt tussen < en > geplaatst. Feitelijk moet dus de uitvoerstream van het programmaatje worden overgenomen, en op het moment dat karakters uit de invoerstream gelezen worden, moeten deze worden ingevoegd.

Kan dit in bash? Of anders bijvoorbeeld perl of C++? Hoe?

Maker van Taekwindow; verplaats en resize je vensters met de Alt-toets!


  • smokalot
  • Registratie: Juni 2001
  • Laatst online: 15-01 22:00

smokalot

titel onder

je bedoelt dat je eerst een lijn krijgt zoals
Geef een getal: <_>
waarbij de _ de cursor is, en dat als iemand dan een getal invoert dit dus op de plaats van die _ komt? En hoe wou je dat dan doen met verschillende inputgroottes? Laat je mensen alleen maar tussen de 0 en 9 een kwadraat uitrekenen?

Ik denk dat dit moeilijk wordt met bash, maar met iets als ncurses is dit wel te doen (C dus).

It sounds like it could be either bad hardware or software


  • Wilke
  • Registratie: December 2000
  • Laatst online: 20:29
Dit lukt in ieder geval met 'screen -L' (zie 'man screen' voor een hoop opties en hoe je dit ook automatisch altijd aan kunt zetten). 'screen -L' logt by default alles wat je vervolgens binnen die sessie intikt naar screenlog.X (waarbij X telt vanaf 0) in de huidige directory.

Dan heb je alleen nog niet die <> eromheen.

[ Voor 8% gewijzigd door Wilke op 08-11-2005 19:24 ]


  • WildernessChild
  • Registratie: Februari 2002
  • Niet online

WildernessChild

Voor al uw hersenspinsels

Topicstarter
@smokalot: de < en > verschijnen niet op het scherm, maar wil ik in mijn gemergede resultaat hebben, om duidelijk input van output te onderscheiden.

@Wilke: uiteindelijk moet de input uit een file komen, en de (gemergede) output weer naar een file geschreven wordt. Het tweede gaat met screen -L natuurlijk vanzelf, maar kun je screen invoer laten lezen uit een file in plaats van de tty?

Maker van Taekwindow; verplaats en resize je vensters met de Alt-toets!


  • Wilke
  • Registratie: December 2000
  • Laatst online: 20:29
Dan denk ik niet dat het uberhaupt mogelijk is, stdin en stdout werken asynchroon van elkaar, je kunt in het algemeen denk ik niet ontdekken wanneer een proces bepaalde invoer daadwerkelijk leest van stdin en het op dat moment ook 'injecten' in de stdout....mja, misschien als je de C library (bv. glibc) of misschien zelfs de kernel gaat wijzigen ofzo (dat is zeker niet het antwoord dat je zocht? :P )

  • JeroenE
  • Registratie: Januari 2001
  • Niet online
Kan dit in bash?
Volgens mij is de enige mogelijkheid om dit te doen (in bash in ieder geval) als je al je scriptjes aanpast. Simpel voorbeeldje:

code:
1
2
3
4
#!/bin/bash
read -p "Geef een getal: " getal
if [ "`tty`" == "not a tty" ]; then echo "Geef een getal: <$getal>"; fi
echo Het kwadraat van $getal is $(($getal * $getal))
Pagina: 1