Sponsored Content
The Lounge What is on Your Mind? How Would You Like Your Loops Served Today? Post 302655839 by agama on Wednesday 13th of June 2012 10:16:30 PM
Old 06-13-2012
Pipes are not free, so from the potential of efficiency I prefer to avoid the cat construct. Further, I prefer my shell loops this way:

Code:
#!/usr/bin/env ksh

while read -u $rfd buf
do
    echo "$buf"
done {rfd}<some-file

Having the shell open the input to the while on a file descriptor other than standard input prevents me, or some future maintainer, from adding an ssh command (or similar stdin gobbling binary) and forgetting to redirect stdin from /dev/null or using an alternate mechanism (-n in the case of ssh) to prevent the binary from causing odd problems with the loop. Maybe it's me, but it seems that there have been a fair few posts on this forum that were related to a while loop's stdin being 'eaten' by a process in the loop.

Letting bash try to run this results in several errors.

A slight twist on the code above allows for the input to be defined at the top of the loop without requiring the extra cat:

Code:
exec {rfd}<data
while read -u $rfd buf
do
    echo "$buf"
done

Again, it doesn't work in bash. The loop below does, but I don't like having to pick the file descriptor value, and rfd=3; exec ${rfd}<data, which would allow me to hard code the constant only once, seems not to work (parsing and expansion order I believe). IMHO, Having the shell automatically assign an available file descriptor value just seems the right thing to do.

Code:
exec 3<data
while read -u 3 buf
do
    echo "$buf"
done

 

4 More Discussions You Might Find Interesting

1. IP Networking

to serve or be served??

I have two machines on my network - one OSX mac and one linux box. The mac is my main workhorse, and the linux box does occasional chores and webserving. Currently the mac shares (via NFS) files with the Liinux box. Would it be less demanding on the mac if I made it a client, and moved my files... (2 Replies)
Discussion started by: mistafeesh
2 Replies

2. Web Development

Symbol Links amongst Apache's served files, is this a security-don't?

I read somewhere that you should make sure Apache is configured to not allow symbolic links to be followed outside the webroot, as this can compromise security. I can imagine how this could lead to a security risk: eg: Is my assumption correct? -- Is it nothing more than: "its just... (0 Replies)
Discussion started by: jzacsh
0 Replies

3. Shell Programming and Scripting

meaning of today=${1:-${today}}

what does today=${1:-${today}} mean??? I saw a script which has these two lines: today=`date '+%y%m%d'` today=${1:-${today}} but both gives the same value for $today user:/export/home/user>today=`date '+%y%m%d'` user:/export/home/user>echo $today 120326... (2 Replies)
Discussion started by: Vidhyaprakash
2 Replies

4. AIX

VIOS backupios -mksysb - does it need to be served by a NIM server ?

working through VIOS backup options. Generally, we store mksysb's on a server and then NFS mount them from it to copy to a VIO optical library, etc. In the case of a VIO backup, I see the -mksysb option to backupios and understand that it doesn't include the NIM resources in the backup. ... (3 Replies)
Discussion started by: maraixadm
3 Replies
staux(3)						     Library Functions Manual							  staux(3)

Name
       st_auxbtadd,  st_auxbtsize, st_auxisymadd, st_auxrndxadd, st_auxrndxadd, st_addtq, st_tqhigh_aux, st_shifttq, st_iaux_copyty, st_changeaux,
       st_changeauxrndx  - routines that provide scalar interfaces to auxiliaries

Syntax
       #include <syms.h>

       long st_auxbtadd(bt)
       long bt;

       long st_auxbtsize(iaux,width)
       long iaux;
       long width;

       long st_auxisymadd (isym)
       long isym;

       long st_auxrndxadd (rfd,index)
       long rfd;
       long index;

       long st_auxrndxadd (idn)
       long idn;

       void st_addtq (iaux,tq)
       long iaux;
       long tq;

       long st_tqhigh_aux(iaux)
       long iaux;

       void st_shifttq (iaux, tq)
       int iaux;
       int tq;

       long st_iaux_copyty (ifd, psym)
       long ifd;
       pSYMR psym;

       void st_changeaux (iaux, aux)
       long iaux;
       AUXU aux;

       void st_changeauxrndx (iaux, rfd, index)
       long iaux;
       long rfd;
       long index;

Description
       Auxiliary entries are unions with a fixed length of four bytes per entry.  Much information is packed within the auxiliaries.  Rather  than
       have the compiler front-ends handle each type of auxiliary entry directly, the following set of routines provide a high-level scalar inter-
       face to the auxiliaries:

       st_auxbtadd	   Adds a type information record (TIR) to the auxiliaries.  It sets the basic type (bt) to the  argument  and	all  other
			   fields to zero. The index to this auxiliary entry is returned.

       st_auxbtsize	   Sets the bit in the TIR, pointed to by the iaux argument.  This argument says the basic type is a bit field and adds an
			   auxiliary with its width in bits.

       st_auxisymadd	   Adds an index into the symbol table (or any other scalar) to the auxiliaries.  It sets the value to the  argument  that
			   will occupy all four bytes. The index to this auxiliary entry is returned.

       st_auxrndxadd	   Adds  a relative index, RNDXR, to the auxiliaries.  It sets the rfd and index to their respective arguments.  The index
			   to this auxiliary entry is returned.

       st_auxrndxadd_idn   Works the same as st_auxrndxadd except that RNDXR is referenced by an index into the dense number table.

       st_iaux_copyty	   Copies the type from the specified file (ifd) for the specified symbol into the auxiliary table for the  current  file.
			   It returns the index to the new aux.

       st_shifttq	   Shifts  in the specified type qualifier, tq (see sym.h), into the auxiliary entry TIR, which is specified by the `iaux'
			   index into the current file. The current type qualifiers shift up one tq so that the first tq (tq0) is free for the new
			   entry.

       st_addtq 	   Adds a type qualifier in the highest or most significant non-tqNil type qualifier.

       st_tqhigh_iaux	   Returns the most significant type qualifier given an index into the files aux table.

       st_changeaux	   Changes the iauxth aux in the current file's auxiliary table to aux.

       st_changeauxrndx    Converts the relative index (RNDXR) auxiliary, which is specified by iaux, to the specified arguments.

See Also
       stfd(3)

								       RISC								  staux(3)
All times are GMT -4. The time now is 10:52 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy