Использование -в качестве имени файла значения stdin / stdout - это соглашение, которое используют многие программы. Это не специальное свойство имени файла. Ядро не распознает -как особые, поэтому любые системные вызовы со ссылкой на -имя файла будут использовать -буквально как имя файла.
С перенаправлением bash -не распознается как специальное имя файла, поэтому bash будет использовать его как буквальное имя файла.
Когда catвидит строку -как имя файла, он воспринимает ее как синоним stdin. Чтобы обойти это, вам нужно изменить строку, которая catвидит таким образом, что она по-прежнему ссылается на файл с именем -. Обычный способ сделать это состоит в том, чтобы префикс имени файла с путем - ./-, или /home/Tim/-. Этот метод также используется для обхода подобных проблем, когда параметры командной строки конфликтуют с именами файлов, поэтому файл, на который ссылаются ./-e, не отображается, например, как параметр -eкомандной строки для программы.