Configuration Information [Automatically generated, do not change]: Machine: i586 OS: linux-gnu Compiler: gcc -I/usr/src/packages/BUILD/bash-3.2 -L/usr/src/packages/BUILD/bash-3.2/../readline-5.2 Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='i586' -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='i586-suse-linux-gnu' -DCONF_VENDOR='suse' -DLOCALEDIR='/usr/share/locale' -DPACKAGE='bash' -DSHELL -DHAVE_CONFIG_H -I. -I. -I./include -I./lib -O2 -march=i586 -mtune=i686 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -g -D_GNU_SOURCE -DRECYCLES_PIDS -Wall -pipe -g -fPIE -fprofile-use uname output: Linux starbase 2.6.22.9-0.4-default #1 SMP 2007/10/05 21:32:04 UTC i686 i686 i386 GNU/Linux Machine Type: i586-suse-linux-gnu
Bash Version: 3.2 Patch Level: 25 Release Status: release Description: In the following script i try to open a free file descriptor for input from a file. The script should read lines out of a textfile, output goes to stdout. This works fine till my last SUSE Linux 10.1 (sorry I don't know the version of the bash). But now (opensuseLinux 10.3) the script aborts with following error message: ./doit: line 29: exec: 3: not found This is the line where i try to open the file descriptor for input: exec ${fd}<$inf This error happens always with every run. If you store the script to a file, eg. 'doit', then you can test it. Call the script like: ./doit <filename> <startline> <endline> The parameters have to be legal, because i stripped all cmdline parsing and errorchecking in this example. I think it's a bug in this release of the bash. -------------------START SCRIPT----------------------------------------------- #!/bin/sh # # File: doit # # get lines from a file from first till last line. # par1 = filename # par2 = first line # par3 = last line # Output goes to Stdout inf=$1 # file to read from sl=$2 # start line el=$3 # end line declare -i fd=3 # type is int ifs='' s='' # textline i=0 # line number # find the next unused file descriptor # range 3-9 (0-2 is STD INPUT/OUTPUT/ERROR) while [ -t ${fd} ] && [ ${fd} -lt 9 ]; do # fd in use let fd++ # inc fd done if ! [ -t ${fd} ]; then # free fd found ifs=$IFS # save IFS IFS='' i=0 # line number exec ${fd}<$inf # open fd for input while read -rsu ${fd} s; do # read line let i++ # inc line number if [ "$i" -ge $sl ] && [ "$i" -le $el ]; then # if in scope echo "$s" # output line fi done exec ${fd}>&- # close fd IFS=$ifs # restore IFS fi -------------------END SCRIPT------------------------------------------------- Repeat-By: Always in every run.