Usar - como um nome de arquivo significa que stdin / stdout é uma convenção que muitos programas usam. Não é uma propriedade especial do nome do arquivo. O kernel não reconhece - como especial, então qualquer chamada de sistema referente a - como um nome de arquivo usará - literalmente como o nome do arquivo.
Com o redirecionamento bash, - não é reconhecido como um nome de arquivo especial, então o bash usará isso como o nome do arquivo literal.
Quando cat vê a string - como um nome de arquivo, trata-a como sinônimo de stdin. Para contornar isso, você precisa alterar a string que cat vê de tal forma que ela 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 em que as opções de linha de comando entram em conflito com nomes de arquivos, portanto, um arquivo chamado ./-e não aparece como a opção de linha de comando -e em um programa, por exemplo.