From owner-freebsd-questions Tue Apr 25 13:53:31 2000 Delivered-To: freebsd-questions@freebsd.org Received: from fw.wintelcom.net (ns1.wintelcom.net [209.1.153.20]) by hub.freebsd.org (Postfix) with ESMTP id 6103637B7E4 for ; Tue, 25 Apr 2000 13:53:27 -0700 (PDT) (envelope-from bright@fw.wintelcom.net) Received: (from bright@localhost) by fw.wintelcom.net (8.10.0/8.10.0) id e3PLMZ119636; Tue, 25 Apr 2000 14:22:35 -0700 (PDT) Date: Tue, 25 Apr 2000 14:22:35 -0700 From: Alfred Perlstein To: Greg Pavelcak Cc: Doug Barton , freebsd-questions@FreeBSD.ORG Subject: Re: Making sh script pause for input Message-ID: <20000425142235.H9754@fw.wintelcom.net> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 1.0.1i In-Reply-To: ; from gpav@som.umass.edu on Tue, Apr 25, 2000 at 04:43:15PM -0400 Sender: owner-freebsd-questions@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG * Greg Pavelcak [000425 14:18] wrote: > On Tue, 25 Apr 2000, Doug Barton wrote: > > > On Tue, 25 Apr 2000, Alfred Perlstein wrote: > > > > > * Doug Barton [000425 11:01] wrote: > > > > Greg Pavelcak wrote: > > > > > > > > > > This is driving me nuts. I want a script that prompts with a > > > > > student's name and then waits for input regarding that student > > > > > then moves on. I've tried using xargs and a script like this: > > > > > > > > The bad news, you can't do that with sh because once you tell it to > > > > take its input from a file that's where it's going to take all of its > > > > input from. The good news, this is a really easy perl script, and this > > > > kind of processing is one of the things perl is really good for. > > > > > > Actually... :) > > > > > > http://www.complete.org/mailinglists/archives/aclug-l-199811/msg00018.html > > > > > > explains some really nifty things you can do with sh and filehandles. > > > > None of which apply to the original poster's exmple. He wants to > > read from the real stdin while inside a loop which is already reading its > > stdin from a file. If you can do what the author asked for in sh, I'd love > > to see it. > > > Just for the record, my original script, > > > #!/bin/sh > > while read LOGNUM CLASS LNAME FNAME GPA MAJOR ; > do > grep -iqe "$FNAME \$ $LNAME" appstatus > if [ $? -eq 1 ]; then > echo $FNAME $LNAME ; > echo -n "Status? " ; > read STATUS > echo "$LOGNUM \$ $CLASS \$ $FNAME \$ $LNAME \$ $GPA \$ $MAJOR \$ $STATUS" >> appstatus ; > fi > done < contractsS00 > > was a failure while > > > #!/bin/sh > > while read LOGNUM CLASS LNAME FNAME GPA MAJOR ; > do > grep -iqe "$FNAME \$ $LNAME" appstatus > if [ $? -eq 1 ]; then > echo $FNAME $LNAME ; > echo -n "Status? " ; > read STATUS < /dev/tty > ^^^^^^^^^^ > echo "$LOGNUM \$ $CLASS \$ $FNAME \$ $LNAME \$ $GPA \$ $MAJOR \$ $STATUS" >> appstatus ; > fi > done < contractsS00 > > was a complete success. I would be glad to credit the kind person > who sent this to me, but perhaps he prefers to remain an > anonymous sh whiz. Actually that's a bad way to do it, simple reason, you can't run the script without a tty, so now if you run the script like this: sh myscript.sh < data_for_read_status.txt It won't work, see my later example for something that should work. FYI, the revelant info from that URL I gave you guys was this: 1b. Reading Files In the csh, all you've got is $<, which reads a line from your tty. What if you've redirected stdin? Tough noogies, you still get your tty, which you really can't redirect. Now, the read statement in the Bourne shell allows you to read from stdin, which catches redirection. It also means that you can do things like this: exec 3