A coisa básica que você quer pode ser algo assim:
function my_less()
{
obj=$1
shift
test -d $obj && ls $obj $@
test -f $obj && less $obj $@
}
Então
my_less thing
fará um ls
ou um less
dependendo do tipo.
O obj=$1
pega o primeiro argumento para a função. O shift
desloca os argumentos restantes "para a esquerda" e $@
é a lista de argumentos atual.
Se você quiser ter algum processamento rudimentar de opções, você pode estender essa função mais ou menos assim:
function my_less()
{
switches=
obj=
while true
do
case $1 in
-*)
switches="$switches $1"
shift
;;
*)
obj=$1
shift
break
;;
esac
done
test -d $obj && ls $switches $obj $@
test -f $obj && less $switches $obj $@
}
Isso coletará todos os comutadores principais e definirá obj
como o primeiro não comutador. Isso fará a coisa errada com frequência, mas é apenas uma sugestão para o próximo passo.