LINUX.IE, website of the Irish Linux Users' Group
Tux rules!

   
Home
New Users
Articles
Download
Projects
Community
Vendors

  Print Version
Email to...
 
Archives:


planetILUG

Recent News

News Archive


Join the
ILUG
on FaceBook


Join the
ILUG
on LinkedIn


Join the
ILUG SETI
Group



















 
 :: Mailing Lists

[ILUG] vanquishing the daemons of shell scripting

[ILUG] vanquishing the daemons of shell scripting

Brian Foster blf at utvinternet.ie
Sun Jul 21 11:00:09 IST 2002


  | Date: Sat, 20 Jul 2002 10:47:36 +0100
  | From: Stephen Shirley <diamond at skynet.ie>
  |[ ... ]
  | It's very easy to get one program to act on the output of a second
  | program: cmd1 | cmd2. But, what if you want cmd1 to act on the output
  | of cmd2 as well? Hmm. Eventually, I came up with this solution:
  | 
  |    mkfifo io
  |    cmd1 <io | cmd2 > io
  | 
  | and bingo, all was well with the world. Now, I have (and had) a sneaking
  | suspcion that it might be possible to do this without using a fifo, and
  | can be done using something like:
  | 
 1|    exec 3>&1
 2|    cmd1 <&3 | cmd2 >&3
 3|    exec 3>&-
  | 
  | but that doesn't work in that form, and i couldn't work out an
  | incantation that would. Anyone got any suggestions?  [ ... ]

 the above, or something close to it, would work if, when the
 1st line is executed, file descriptor (fdesc) 1 is open for both
 read and write (R/W) to a suitable entity (e.g., a pipe/FIFO; I
 imagine a socket or something of that ilk could be made to work
 but have no idea why you'd want to go to the trouble.... ).

 but in any case, all that is unlikely to be the case:
  · most probably, fdesc 1 is yer tty (e.g. screen + keyboard);
 and
  · quite possibly is open only for write (being stdout).

 you need it open for R/W because all dup2(2) --- which is all
 `n>&m' means -- does is replicate the fdesc handle.  it does not
 change the access mode; e.g., if the original fdesc (m) was only
 open for writing (W), that's all the new fdesc (n) is open for.
 yet in the 2nd line, it's needed for both R (cmd1) and W (cmd2).

 whilst it's impossible to say for certain from this excerpt, it
 seems a reasonable guess that fdesc 1 when the 1st line executes
 is the stdout of the script itself, which is most probably yer
 tty.  that means, if it does happen to be open for R/W (which is
 the case on some systems), `cmd2' would be writing to the screen
 whilst `cmd1' is reading from the keyboard --- i.e., the poor
 confused human luser is "clearly" expected to manually echo back
 to the computer what it prints.

 good luck!  ;-)

 upshot:  the FIFO is needed.  and this isn't a shell scripting
          problem per se.

 the FIFO solution is fine.  I've used variations (plural) on
 this approach to extend the Korn (ksh(1)) shell language, by
 providing a co-processing interpreter --- `ksh' sends certain
 predefined commands to the co-process, handling control over
 to the co-process until it indicates processing is complete
 and `ksh' can resume normal processing.  with some thought and
 care to insure signals do something rational, works great for
 adding a scripting language (which is the purpose) cheaply to
 script-less programs (useful when you can't modify the, IMHO,
 buggy program to use, e.g., TCL).

cheers!
	-blf-
--
 Innovative, very experienced, Unix and      | Brian Foster    Dublin, Ireland
 Chorus (embedded RTOS) kernel internals     | e-mail: blf at utvinternet.ie
 expert looking for a new position ...       | mobile: (+353 or 0)86 854 9268
  For a résumé, contact me, or see my website  http://www.blf.utvinternet.ie

    Stop E$$o (ExxonMobile):  «Whatever you do, don't buy Esso --- they
     don't give a damn about global warming.»    http://www.stopesso.com
     Supported by Greenpeace, Friends of the Earth, and numerous others...




More information about the ILUG mailing list
Read this without the formatting.
                                                                                                    

 

Hosted by HEAnet


Maintained by the ILUG website team. The aim of Linux.ie is to support and help commercial and private users of Linux in Ireland. You can display ILUG news in your own webpages, read backend information to find out how. Networking services kindly provided by HEAnet, server kindly donated by Dell. Linux is a trademark of Linus Torvalds, used with permission. No penguins were harmed in the production or maintenance of this highly praised website. Looking for the Indian Linux Users' Group? Try here. If you've read all this and aren't a lawyer: you should be!
RSS Version
Powered by Dell