From: pjfarley AT dorsai DOT org (Peter J. Farley III) Newsgroups: comp.os.msdos.djgpp Subject: Possible bash bug in "for x in $path/*x*" Date: Thu, 21 May 1998 01:55:24 GMT Organization: http://extra.newsguy.com Lines: 68 Message-ID: <35637b2a.6087655@enews.newsguy.com> NNTP-Posting-Host: p-504.newsdawg.com To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Precedence: bulk Hi all. I don't know if this is a bug or a feature, so I'm asking those in the know to please enlighten me. The short test shell script listed at the end of this message looks for all programs in the $PATH that contain the string "awk" somewhere in the name. The original shell script was authored by Heiner Steven , and does some testing of awk features on the executables it finds. On my W95/DJGPP V2.01 system (DOS box), though, under bash version "GNU bash, version 1.14.7(2) r3.1 w/multibyte extension", when there is NOT any file in a directory in the $PATH which matches *awk*, the syntax "for awk in $path/*awk*" sets the variable $awk to the value of the path element plus "/*awk*". For example, if "//C/WINDOWS" is in the $PATH variable, and there are NOT any files in that directory matching *awk*, then the $awk variable will be set to a value of "//C/WINDOWS/*awk*". This isn't a problem until the script reaches the test expression: [ `basename "$awk"` = "$PN" ] && continue When $awk's value is "//C/WINDOWS/*awk*", this is expanded to *every* filename IN THE CURRENT DIRECTORY which matches *awk*, which causes the test expression to fail with the message: ./testawk: [: too many arguments When you invoke the test script with the "-x" argument so all of the statements and their expansions are displayed, the offending basename expression has been translated to (for example): [ trmperf1.awk trmperf2.awk trmperf3.awk wrap.awk wrap2.awk wrap3.awk wrap4.awk wrap5.awk wrap6.awk wrap7.awk = testawk ] My system generates a much larger list of names, which I truncated for the above example, but you get the idea. Is this behavior of "for awk in $path/*awk*" normal, or is this a bug in DJGPP bash? TIA for any help or info you can provide. ==================== Test Script ================================ : # testawk - test awk features (stv, 3/98) # usage: testawk # modified & stripped down to check functioning of # for awk in $path/*awk* do ... done (pjf3, 5/20/98) PN=`basename "$0"` # Program name for path in `echo "$PATH" | sed 's|^:|./ |;s|:$| ./|;s|:| |g'` do for awk in $path/*awk* do case "$awk" in *.exe|*.com|*.bat);; # DOS/Windows *.*) continue;; # ignore "script.awk" esac [ `basename "$awk"` = "$PN" ] && continue [ -x $awk ] && { echo "Found executable awk: '$awk'"; continue } echo "Found non-executable awk: '$awk'" done done ==================== Test Script ================================ ---------------------------------------------------- Peter J. Farley III (pjfarley AT dorsai DOT org)