Em primeiro lugar, os redirecionamentos podem ocorrer em qualquer lugar na linha de comando, não necessariamente no final ou no início.
Por exemplo:
echo foo >spamegg bar
salvará foo bar no arquivo spamegg .
Além disso, existem duas versões de which , uma é shell embutida e a outra é executável externa (vem com debianutils no Debian).
Em seu comando:
which lsb_release 2>&1 /dev/null
por 2&>1 , você está redirecionando o STDERR (FD 2) para onde está apontado STDOUT (FD 1), não para /dev/null e isso é feito primeiro.
Portanto, o restante do comando é:
which lsb_release /dev/null
Como não há comando como /dev/null , daí o erro.
Observe que esse comportamento depende do fato de which ser um shell interno ou executável externo, bash , ksh , dash não tem um incorporado e usa which externo e isso simplesmente ignora o erro , não mostra nenhuma mensagem de erro.
Por outro lado, zsh usa um which incorporado e mostra:
/dev/null not found
Então, presumivelmente, esse erro específico é mostrado pelo which do shell que você está usando.
Além disso, parece que você deseja apenas redirecionar o STDERR para /dev/null se lsb_release não existir no PATH , ou seja, which exibirá um erro. Em caso afirmativo, basta redirecionar o STDERR para /dev/null :
which lsb_release 2> /dev/null