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.
You probably should quote the arguments:
ReplyDeletefunction @ { "$@" > /dev/null ; }
Indeed, thanks. I've now update the post.
DeleteDefining a function _run_parts followed by:
ReplyDeletealias run-parts=_run_parts
should work with a non-bash shell ...
Apologies for responding until now.
DeleteThere are three problems with that:
1. Aliases are not POSIX :-)
2. Aliases are not functions (yeah, being picky here for the fun)
3. Aliases are not expanded in bash in non-interactive mode. You need to setopt first, in which case you could as well just use a non-standard function name.
Sorry, just found out about your reply today ...
DeleteAccording to http://pubs.opengroup.org/onlinepubs/007904975/utilities/xcu_chap02.html#tag_02_03_01 aliases actually seem to be in the POSIX standard.
In my blogpost about shell aliases I gave a bit more details: they are an extension (note the XSI marker).
Delete