[Bash-completion-devel] vncviewer

Freddy Vulto fvulto at gmail.com
Tue Mar 3 22:03:58 UTC 2009


On Tue, Mar 3, 2009 at 3:12 PM, Mike Kelly <pioto at pioto.org> wrote:
> Actually, which is available on every UNIX system I've ever used...
>
> What you actually want is "$(type -P vncviewer)". Otherwise, if they
> have set alias vncviewer='vncviewer -foo' somewhere, type -p returns
> nothing, while type -P will return the expected results.
>
> Also, readlink -f isn't portable -- it doesn't work on FreeBSD, at
> least. On FreeBSD, you need to use realpath instead.

Then I suggest we use `type' instead of `which', since `type' is a
builtin.  What do you think about this code then:

---8<-------------------------------------------------------------------

# Get real command.
# @param $1  Command
# @stdout  Filename of cmd in PATH, possible symbolic links resolved.
# @return  True (0) if command found, False (> 0) if not.
_realcommand() {
    if type -p realpath > /dev/null; then
	realpath "$(type -P "$1")"
    elif type -p readlink > /dev/null; then
	readlink -f "$(type -P "$1")"
    else
	echo "$1"
    fi
}

have vncviewer &&
_vncviewer_bootstrap() {
	local fname
	case "$(_realcommand vncviewer)" in
		*xvnc4viewer)      fname=_xvnc4viewer    ;;
		*tightvncviewer|*) fname=_tightvncviewer ;;
	esac
	# Install real completion for subsequent completions
	complete -F $fname vncviewer
	$fname  # Generate completions once for now
	unset -f _vncviewer_bootstrap
} &&
complete -F _vncviewer_bootstrap vncviewer

---8<-------------------------------------------------------------------

If we would let the `_vncviewer_bootstrap' `*-case' default to
`_tightvncviewer' this solution is gonna work on Mandriva... untill
a distribution comes along with another default `vncviewer' :-(  so
we still can improve with a package-level solution indeed.

Regards,
Freddy Vulto
http://fvue.nl



More information about the Bash-completion-devel mailing list