Yesterday I posted about some bad
shell code I had found and posted an improved version. Part of the
reason for posting it was that I hoping someone could point out any
errors in the version I posted. Fortunately Neil Moore emailed me some
improvements.
-
If the script returns more than one line they will be removed by the
$(…) expansion when it is split into words. The solution there is to
surround it in double quotes. -
The next problem Neil pointed out was that $@ should be
surrounded by quotes in pretty much every case, otherwise parameters
with spaces in will get split into separate parameters. -
The final problem is that if the script includes a return statement, it
will stop the inner most function or sourced script, but not during
eval.The solution is to enclose it in a function:dummy() { eval "$(perl "$CONF_DIR/project.pl" "$@")"; } dummy "$@"
Since making the post, I discovered that Solaris’ /bin/sh
doesn’t like $(...), so it’s probably better to use backticks
instead if you want to be portable. As I know the output from the script
I’m not worried about return statements, so I’ve ended up with:
eval "`perl "$CONF_DIR/project.pl" "$@"`"