Usar -como nome de arquivo para significar stdin / stdout é uma convenção usada por muitos programas. Não é uma propriedade especial do nome do arquivo. O kernel não reconhece -como especial, portanto, qualquer chamada do sistema que se refere a -um nome de arquivo será usada -literalmente como o nome do arquivo.
Com o redirecionamento do bash, -não é reconhecido como um nome de arquivo especial; portanto, o bash o usará como o nome do arquivo literal.
Quando catvê a string -como um nome de arquivo, trata-a como sinônimo de stdin. Para contornar isso, você precisa alterar a string que catvê de tal maneira que ainda se refere a um arquivo chamado -. A maneira usual de fazer isso é prefixar o nome do arquivo com um caminho - ./-, ou /home/Tim/-. Essa técnica também é usada para solucionar problemas semelhantes nos quais as opções de linha de comando se chocam com os nomes de arquivo; portanto, um arquivo chamado ./-enão aparece como a -eopção de linha de comando de um programa, por exemplo.