Sometimes people make mistakes and things don't go as expected. Eventually, they find out and say oops.
The next blog post for the a bashism a week series was scheduled for publishing on next Wednesday due to a mistake from my side. Sorry about that! given that it's a bit late today, let's better take a break this week.
August 28, 2013
August 21, 2013
A bashism a week: function names
The bashism of this week is easy to hit when overriding the execution of a command with a shell function. Think of the following example scenario:
Replacing the yes(1) command with a shell function:
Now every time yes is called the above-defined shell function will be called instead of /usr/bin/yes.
Apply the same principle to replace the run-parts(8) command with the following overly-simplified shell function:
It also works as expected. However, when running it under a shell that only supports the function names required by the POSIX:2001 specification it will fail. One such shell is dash, which aborts with a "Syntax error: Bad function name", another is posh which aborts with a "run-parts: invalid function name".
If you ever want to have function names with dashes, equal signs, commas, and other unusual characters make sure you use bash and ksh-like shells (and keep that code to yourself). Yes, you can even have batch-like silencing of stdout with
Update: there were missing quotation marks in the example @ function.
Replacing the yes(1) command with a shell function:
$ exec /bin/bash $ type -t yes file $ yes() { while :; do echo ${1:-y}; done; } $ type -t yes function
Now every time yes is called the above-defined shell function will be called instead of /usr/bin/yes.
Apply the same principle to replace the run-parts(8) command with the following overly-simplified shell function:
$ run-parts() { if [ "$1" = "--test" ]; then shift; simulate=true; else simulate=false; fi; for f in "$1"/*; do [ -x "$f" ] && [ -f "$f" ] || continue; case "$(basename "$f")" in *[!a-zA-Z0-9_/-]*) : ;; *) if $simulate; then echo $f; else $f; fi ;; esac; done } $ type -t run-parts function(note the use of negative matching)
It also works as expected. However, when running it under a shell that only supports the function names required by the POSIX:2001 specification it will fail. One such shell is dash, which aborts with a "Syntax error: Bad function name", another is posh which aborts with a "run-parts: invalid function name".
If you ever want to have function names with dashes, equal signs, commas, and other unusual characters make sure you use bash and ksh-like shells (and keep that code to yourself). Yes, you can even have batch-like silencing of stdout with
function @ { "$@" > /dev/null ; }
Update: there were missing quotation marks in the example @ function.
August 14, 2013
A bashism a week is back
After a while without posts on the a bashism a week series, it is coming back!
Next week, at the usual time and day of the week, the series of blog posts about bashisms will be back for at least one more month. Subscribe via Atom and don't miss any post and check all the previous posts.
The a bashism a week series cover some of the differences between bash and the behavior of other shells, and the requirements by the POSIX standard regarding shell scripting. Or put simply: they are a guide to common bashisms, allowing you to identify them and avoid their use for a more compatible and portable code.
Happy reading!
Next week, at the usual time and day of the week, the series of blog posts about bashisms will be back for at least one more month. Subscribe via Atom and don't miss any post and check all the previous posts.
The a bashism a week series cover some of the differences between bash and the behavior of other shells, and the requirements by the POSIX standard regarding shell scripting. Or put simply: they are a guide to common bashisms, allowing you to identify them and avoid their use for a more compatible and portable code.
Happy reading!
Subscribe to:
Posts (Atom)