Ok, encontrei uma maneira de fazer isso funcionar com facilidade:
ln -s 'realpath ../dir2/file' link #not perfect
Não é perfeito - $( ... ) é preferível a '...' para substituição de comando, e há um problema com nomes de arquivos com espaços - a "double quotes" corrige isso enquanto permite que a substituição de comando continue. Então, aqui está uma resposta atualizada:
ln -s "$(realpath ../dir2/file)" link
Então, se eu quiser que o nome do arquivo seja o mesmo,
ln -s "$(realpath ../dir2/file)" .