Você não pode usar um alias para adicionar coisas depois de argumentos, você precisa de uma função. Use um alias apenas para fornecer um nome alternativo a um comando ( alias myalias=mycommand ) ou para fornecer argumentos iniciais ( alias myalias='foo --option1 --option2' ).
No bash, você pode usar qualquer um dos function myfunction { … } ou myfunction () { … } ou function myfunction () { … } para definir uma função. A forma myfunction () … tem a vantagem de ser portável para todas as sh shells. Os formulários com a palavra-chave function têm a vantagem de funcionar mesmo se myfunction for um alias (você pode usar \myfunction () … para fazer o formulário padrão funcionar nesse caso). Além do pseudônimo, essas sintaxes são exatamente equivalentes no bash.
O que segue o nome da função ou o () deve ser um comando complexo bem formado. A julgar pela sua resposta (o código na sua pergunta não produz a mensagem de erro, obviamente você não postou a versão que você testado), seu erro foi que o comando complexo que você escreveu não está correto. As chaves { e } são reconhecidas apenas como sintaxe de lista inicial e lista final quando são a primeira coisa em um comando, portanto, você precisa de uma quebra de linha ou um ponto e vírgula antes da chave de fechamento.
Além disso, em vez de passar dois argumentos para diff e ignorar os outros, você deve passar todos eles. Isso é o que "$@" é para.
function dif () { diff "$1" "$2" | less; }
Além disso, as personalizações para sessões bash interativas devem entrar em .bashrc , não .bash_profile . .bash_profile é lido apenas por shells de login, não é lido quando você abre uma nova instância do bash, por exemplo em um terminal. Por causa de um defeito de projeto no bash, .bashrc não é lido por shells de login, mesmo que sejam interativos, então você deve colocar esta linha em seu .bash_profile :
if [[ $- == *i* ]]; then . ~/.bashrc; fi
e coloque a personalização interativa, como aliases, funções como dif , combinações de teclas, prompts, etc. em ~/.bashrc .