Как можно считать это решение правильным?
Потому что цель cat
на самом деле не для отображения файлов. Это побочный эффект.
Назначение cat
- con cat enate файлов (отсюда и название). Он делает это, читая каждый файл по очереди и выводя содержимое каждого на свой стандартный вывод, который, в свою очередь, при желании может быть перенаправлен.
Часто бывает полезно использовать cat
, чтобы просто отображать содержимое файла, и это происходит потому, что по умолчанию стандартный вывод процесса привязан к терминалу. Вы также можете использовать специальный пейджер, например less
или его старший брат more
, для просмотра файлов, поскольку пейджер предназначен для просмотра файлов. .
Если cat
завершит свой вывод или содержимое каждого файла новой строкой, это нарушит его давний договор. Это больше не будет полезно для фактического объединения файлов; если бы вам нужно было взять большой файл, разделить его на части и повторно соединить части, используя такой модифицированный cat
, результат будет совсем не тем, с чего вы начали.
Помните, что философия UNIX заключается в том, что каждый инструмент должен делать что-то маленькое, делать это хорошо и делать это таким образом, чтобы различные инструменты можно было комбинировать для формирования более крупных контекстов.Вот почему я могу сделать что-то вроде ssh'ing для удаленного хоста, чтобы выполнить команду, передать вывод сеанса ssh в локальный инструмент (awk, perl, grep, что угодно) для массажа вывода и передать результат этого в, скажем, lpr
, чтобы получить распечатку на бумажном носителе, или less
для просмотра с возможностью прокрутки вперед и назад. От стандартного вывода до стандартного ввода с инструментами, где каждый инструмент выполняет только одно действие, и большинство простых инструментов (и многие из не очень простых инструментов) либо следуют этому шаблону по умолчанию, либо их можно заставить следовать этому шаблону с помощью соответствующей команды. -строчные параметры.
есть ли альтернативное решение, чтобы мое имя пользователя никогда не становилось жертвой файла или строки без терминатора новой строки?
Да, конечно. Установите подсказку так, чтобы она начиналась с новой строки, как показано ниже.
$ printf 'hello' > $TMP/hello
$ PS1='\u \W: '
michael ~: cat $TMP/hello
hellomichael ~: PS1='\n\u \W: '
michael ~: cat $TMP/hello
hello
michael ~: