# 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