Como Hauke apontou, seu problema é que você está esperando 2 argumentos, mas você dá a sua função vários argumentos. O link*
é expandido pelo shell antes de ser passado para a sua função, então o que você está realmente executando é
linkcp lnk1 lnk2 temp
porque lnk*
se expande para lnk1 lnk2
.
Então, o que você realmente quer é algo como:
linkcp() {
## Save the arguments given to the function in the args array
args=("$@");
## The last element of the array is the target directory
target=${args[((${#args[@]}-1))]}
## If the target is a directory
if [ -d "$target" ];
then
## Iterate through the rest of the arguments given
## and copy accordingly
for((i=0; i<$#-1; i++))
do
cp -v "$(realpath "${args[$i]}")" "$target"
done
## If the target does not exist or is not a directory, complain
else
echo "$target does not exist or is not a dirtectory"
fi
}