Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Lonely spacecowboy
On Tue, Mar 27, 2007 at 03:01:42PM -0400, Brian K. White wrote:
> You did not say in what way it fails, nor what <cmd> might be.
> But I can say 2 things:
>
> 1) pipeing into read only "works" in ksh, the real korn ksh not pdksh or
> any of the others like bash and zsh that have a "ksh compatibility" mode.
> But you can still use a similar construct with file redirection that will
> work.
> The difference is "|read" creates a child process that read runs in, and
> any env variables set in that child process are not visible from the
> parent, and the while-do-done command (and all commands in that loop) ar
> running in the parent.
While this is true for bash and pdksh it's not true for zsh:
~$ echo foo | read
~$ echo $REPLY
foo
[...]
> You might be able to redirect stdin just for the cmd but I never tried that
> in a loop like this so I don't know if it actually works.
Generally done as:
while IFS= read -r <&3; do
cmd ... "$REPLY"
done 3< file.txt
(read without -r or with the default value of IFS is very
special, you generally don't want that in scripts).
>
> # test for no tty to allow for cron jobs, cgi script, print filter, etc...
> tty -s && MYTTY=`tty` || MYTTY=/dev/null
> while read
> do
> vi "$REPLY" <$MYTTY
> done < files.txt
Even if there's a tty, there's no guarantee that stdin is
guaranteed. There's no need for that trick except if you're
using csh type shells that hardly have any fd handling
capability.
> You could also just use awk and not worry about stdin and tty and read
> etc...
> no redirection or piping, no read command, no tty issues, etc...
>
> awk '{system("somecommand \""$0"\"")}' files.txt
Then you'd run into more problems (possibly serious) if the
lines in files.txt contain any ", \, $, `...
> It's a little less efficient because system() spawns a new sh process to
> run command in, where the while-read loop will run command right in the
> same top level shell process where the while loop itself is running.
[...]
If "<cmd>" is not builtin, there's be as many processes (unless
is not optimised to exec the last command is run). The
difference is on the loading and initialising of sh.
--
Stéphane
Messages sorted by:
Reverse Date,
Date,
Thread,
Author