Em:
df -h | f
Você redirecionou df -h output para f standard in e depois chamou f sem nenhum argumento, $@ está vazio.
Por outro lado:
df -h | f cat
Você redirecionou df -h output para f standard, em seguida, chamou f com um argumento cat . "$@" dentro de f expandido para cat . cat padrão concatenado em, que é df -h output, para saída padrão.