Gentoo Archives: gentoo-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-dev@l.g.o
Cc: Mike Frysinger <vapier@g.o>
Subject: Re: [gentoo-dev] multiprocessing.eclass: doing parallel work in bash
Date: Mon, 04 Jun 2012 01:42:35
Message-Id: 4FCC124E.8070706@gentoo.org
In Reply to: Re: [gentoo-dev] multiprocessing.eclass: doing parallel work in bash by Mike Frysinger
On 06/02/2012 10:08 PM, Mike Frysinger wrote:
> # @FUNCTION: redirect_alloc_fd > # @USAGE: <var> <file> [redirection] > # @DESCRIPTION: > # Find a free fd and redirect the specified file via it. Store the new > # fd in the specified variable. Useful for the cases where we don't care > # about the exact fd #. > redirect_alloc_fd() { > local var=$1 file=$2 redir=${3:-"<>"} > > if [[ $(( (BASH_VERSINFO[0] << 8) + BASH_VERSINFO[1] )) -ge $(( (4 << 8) + 1 )) ]] ; then > # Newer bash provides this functionality. > eval "exec {${var}}${redir}'${file}'" > else > # Need to provide the functionality ourselves. > local fd=10 > while :; do > # Make sure the fd isn't open. It could be a char device, > # or a symlink (possibly broken) to something else. > if [[ ! -e /dev/fd/${fd} ]] && [[ ! -L /dev/fd/${fd} ]] ; then > eval "exec ${fd}${redir}'${file}'" && break > fi > [[ ${fd} -gt 1024 ]] && return 1 # sanity > : $(( ++fd )) > done > : $(( ${var} = fd )) > fi > } > > fi
Where it returns 1 if [[ ${fd} -gt 1024 ]], maybe it would be best to die there. It shouldn't fail there in practice, but if it does, it would be really helpful to exactly where it failed. -- Thanks, Zac