Da página man do GNU grep:
-f FILE, --file=FILE Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. (-f is specified by POSIX.) -v, --invert-match Invert the sense of matching, to select non-matching lines. (-v is specified by POSIX.)
então grep -f /dev/null
irá combinar nada e grep -v -f /dev/null
irá inverter isso e combinar tudo .
Eu tenho acesso a toda uma pletora de sistemas FreeBSD, mas todos deles têm o GNU grep instalado porque é muito melhor (tanto para velocidade e recursos, embora pareça que BSD grep está alcançando ). Ainda existem diferenças, por ex. em limites de palavras .
Eu suspeito que este seja um bug do BSD grep, embora talvez a especificação seja ambígua. Uma nota do link "catching up": BSD grep é basicamente um esforço para obter um clone do GNU grep mais permissivamente licenciado, o que significa que ele sempre estará "atrasado" em pelo menos alguma coisa.
Se possível, eu recomendo instalar o GNU grep nesses sistemas usando o BSD grep.
Se você está apenas tentando tornar seu código mais portável, suponho que eu continuaria perguntando por que você está ganhando por ~ nada. O que você está realmente tentando alcançar? Talvez seja melhor focar.