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

Reply via email to