This is a "user" problem. You are using the wrong features for the task, your code should read:
| for f in *; do ./test "$f"; done and quote all other variable expansions. NEVER do: for foo in `...` OR for foo in $(...( This is wrong, because you're relying on word splitting and glob expansion, which is wrong 99% of the cases. Read: - http://mywiki.wooledge.org/WordSplitting - http://mywiki.wooledge.org/Quotes It is totally not a bash bug (read the manual, it's documented). On Wed, Mar 26, 2014 at 05:30:12PM -0700, billyco...@gmail.com wrote: > I tested on bash 4.3 and 3.0 > > testing]$ bash --version > bash --version > GNU bash, version 4.3.0(1)-release (x86_64-unknown-linux-gnu) > > In a directory I have: > > testing]$ ls -l > total 16 > -rw-r--r-- 1 hpierce hpierce 77 Mar 26 20:09 dog1 > -rw-r--r-- 1 hpierce hpierce 77 Mar 26 20:09 dog2 > -rw-r--r-- 1 hpierce hpierce 77 Mar 26 20:09 dog3 > -rw-r--r-- 1 hpierce hpierce 0 Mar 26 20:07 dog4 > -rwxr-xr-x 1 hpierce hpierce 80 Mar 26 20:02 test > > dog1, dog2, and dog3 have content. dog4 is empty. > > test is a simple script: > > testing]$ cat test > #!/bin/bash > FILE=$1 > echo $FILE > if [ ! -e $FILE ] > then > echo "Usage: $0 <file>" > exit 1 > else > echo $FILE exists > fi > > Here's a regular run: > > testing]$ for f in *; do ./test $f; done > dog1 > dog1 exists > dog2 > dog2 exists > dog3 > dog3 exists > dog4 > dog4 exists > test > test exists > > Now I add a ls: > > testing]$ for f in `ls dog*`; do ./test $f; done > dog1 > Usage: ./test <file> > dog2 > Usage: ./test <file> > dog3 > Usage: ./test <file> > dog4 > Usage: ./test <file> > > So I moved it to an earlier version of bash > > testing]$ bash --version > bash --version > GNU bash, version 3.00.15(1)-release (x86_64-redhat-linux-gnu) > > testing]$ for f in `ls dog*`; do ./test $f; done > dog1 > dog1 exists > dog2 > dog2 exists > dog3 > dog3 exists > dog4 > dog4 exists > > > -- Eduardo Alan Bustamante López