Seu sistema provavelmente tem bash instalado em vários locais, seja como versões diferentes de bash ou apenas links simbólicos.
which não é realmente um comando útil para a maioria das finalidades - não é realmente portátil ou muito utilizável em scripts. Em geral, type é melhor. A ideia por trás de which é fazer uma pesquisa em PATH do comando que você fornece como argumento.
$SHELL não reflete necessariamente o shell em execução no momento. Em vez disso, $SHELL é o shell preferido do usuário , que normalmente é o definido em %código%. Se você iniciar um shell diferente após o login, você não pode necessariamente esperar que /etc/passwd corresponda ao shell atual.
Como você pode ver, $SHELL e $SHELL são completamente não relacionados. Nenhum destes lhe dirá qual shell você está realmente executando.
Nota: Infelizmente, a correspondência do shell que você está executando atualmente com um local no sistema de arquivos é mais difícil do que se imagina. Isso ocorre porque os binários são carregados na memória para serem executados e, na maioria dos sistemas, a cópia na memória continuará sendo executada mesmo após você excluir o original do disco (o kernel pode manter a cópia do disco no "limbo" até que seja realmente não é mais necessário). Eu não acho que haja alguma maneira portátil de fazer isso - você teria que recorrer a métodos específicos de plataforma. Por exemplo, no Linux, examinar o link which deve dar uma ideia decente do que arquivo está em execução (onde /proc/$$/exe é o ID do processo do seu shell em execução). Infelizmente eu não estou familiarizado com o Solaris, então não posso ajudá-lo.