Jeff King [off-list ref] writes:
cat >foo.sh <<\EOF
#!/bin/sh
echo my arguments are "$@"
EOF
cannot have the mechanical replace you mentioned above. It would need:
cat >foo.sh <<EOF
#!$SHELL_PATH
echo my arguments are "\$@"
EOF
or:
{
echo "#!$SHELL_PATH" &&
cat <<EOF
echo my arguments are "$@"
EOF
} >foo.sh
When I have hard-coded "#!/bin/sh", my thinking is usually "this is less
cumbersome to type and to read, and this script-let is so small that
even Solaris will get it right".
I am toying with the pros-and-cons of
write_script () {
echo "#!$1"
shift
cat
}
so that the above can become
write_script "$SHELL_PATH" >foo.sh <<-EOF
echo my arguments are "\$@"
EOF
without requiring the brain-cycle to waste on the "Is this simple enough
for even Solaris to grok?" guess game. This should also be reusable for
other stuff like $PERL_PATH, I would think.