Fixes the interaction between if/then/else/fi syntax and variables.
    I planned to do it right from the beginning, but my implementation
    was buggy.  Also adds the relevant test cases.  Also adds some old
    Matt Kraai variable test cases that got left out somehow.
		
	
		
			
				
	
	
		
			90 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # try running this with bash, ksh, ash, and hush.
 | |
| 
 | |
| # simple quoting rules.
 | |
| echo a  b
 | |
| echo "a  b"
 | |
| echo a "" b
 | |
| echo a '' b
 | |
| echo hello?
 | |
| echo "hello?"
 | |
| echo t* hello
 | |
| echo t\* hello
 | |
| 
 | |
| # quick and painless exit for lash
 | |
| if false; then true; exit; fi
 | |
| 
 | |
| # fairly simple command substitution
 | |
| echo `echo -e foo\\\necho bar`
 | |
| 
 | |
| echo THIS IS A TEST >foo
 | |
| cat $(echo FOO | tr 'A-Z' 'a-z')
 | |
| cat foo | tr 'A-Z' 'a-z'
 | |
| cat $(echo FOO | tr 'A-Z' 'a-z') | tr 'A-Z' 'a-z'
 | |
| 
 | |
| cat foo | if true;  then tr 'A-Z' 'a-z'; else echo bar1; fi
 | |
| cat foo | if false; then tr 'A-Z' 'a-z'; else echo bar2; fi
 | |
| if true;  then tr 'A-Z' 'a-z'; else echo bar3; fi <foo
 | |
| if false; then tr 'A-Z' 'a-z'; else echo bar4; fi <foo
 | |
| if true || false; then echo foo; else echo bar5; fi
 | |
| if true && false; then echo bar6; else echo foo; fi
 | |
| 
 | |
| # basic distinction between local and env variables
 | |
| unset FOO
 | |
| FOO=bar env | grep FOO
 | |
| echo "but not here: $FOO"
 | |
| FOO=bar
 | |
| env | grep FOO
 | |
| echo "yes, here: $FOO"
 | |
| FOO=
 | |
| echo a $FOO b
 | |
| echo "a $FOO b"
 | |
| 
 | |
| # not quite so basic variables.  Credit to Matt Kraai.
 | |
| unset FOO
 | |
| FOO=bar
 | |
| export FOO
 | |
| env | grep FOO
 | |
| unset FOO
 | |
| export FOO=bar
 | |
| FOO=baz
 | |
| env | grep FOO
 | |
| 
 | |
| # interaction between environment variables and if/then and subshells
 | |
| FOO=default
 | |
| if true; then FOO=new; fi
 | |
| echo $FOO
 | |
| FOO=default
 | |
| (FOO=bogus)
 | |
| echo $FOO
 | |
| 
 | |
| # make sure we can duplicate file descriptors properly
 | |
| echo replacement >foo 2>&1
 | |
| cat foo
 | |
| cat doesnt_exist >foo 2>&1
 | |
| tr 'a-z' 'A-Z' <foo
 | |
| 
 | |
| # fairly simple example of hush expanding variables too early
 | |
| unset TMP
 | |
| rm -f fish
 | |
| TMP=fish && >$TMP
 | |
| ls fish
 | |
| 
 | |
| # ash, lash, and hush do not create fish; bash and ksh do.
 | |
| # Thanks to Tapani Tarvainen <tt@mit.jyu.fi> for this stress test.
 | |
| unset TMP
 | |
| rm -f fish
 | |
| TMP=fish >$TMP
 | |
| ls fish
 | |
| 
 | |
| # The following example shows that hush's parser is
 | |
| # not _really_ Bourne compatible
 | |
| echo "echo Hello World" >"a=b"
 | |
| unset a
 | |
| chmod a+x "a=b"
 | |
| PATH=$PATH:.
 | |
| "a=b"
 | |
| echo $a
 | |
| 
 | |
| # assuming the shell wasn't too buggy, clean up the mess
 | |
| rm -f a=b fish foo
 |