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