Что я получаю:
host:~ user$ cat example.txt
some texthost:~ stas$
Что я хочу получить:
host:~ user$ cat example.txt
some text
host:~ stas$
Есть ли способ заставить меня cat
вести себя так?
Я использую Bash на Mac OS X.
Что я получаю:
host:~ user$ cat example.txt
some texthost:~ stas$
Что я хочу получить:
host:~ user$ cat example.txt
some text
host:~ stas$
Есть ли способ заставить меня cat
вести себя так?
Я использую Bash на Mac OS X.
Ответы:
Большинство инструментов Unix хорошо работают с текстовыми файлами. Текстовый файл состоит из последовательности строк. Строка состоит из последовательности печатных символов, заканчивающихся символом новой строки. В частности, последний символ непустого текстового файла всегда является символом новой строки. Очевидно, example.txt
содержит только some text
без окончательного перевода строки, так что это не текстовый файл.
cat
делает простую работу; превращение произвольных файлов в текстовые файлы не является частью этой работы. Некоторые другие инструменты всегда превращают их ввод в текстовые файлы; если вы не уверены, что отображаемый файл заканчивается новой строкой, попробуйте запустить awk 1
вместо cat
.
Вы можете сделать так, чтобы bash отображал подсказку на следующей строке, если предыдущая команда оставила курсор где-то, кроме последнего поля. Поместите это в свое .bashrc
(вариант от GetFree предложения Денниса Уильямсона ):
shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1
PROMPT_COMMAND
и, если он не равен 0, использовать \n
символ новой строки ( ) в качестве первого символа PS1
.
Я предпочитаю следующий метод ...
cat example.txt ; echo
Это не оценивает содержимое example.txt
или не добавляет новую строку. Это просто повторяет новую строку после того, как кошка готова, ее легко запомнить, и никто не задумывается о том, правильно ли они используют сильные или слабые цитаты.
Единственным недостатком, на самом деле, является то, что вы получите дополнительный символ новой строки, если файл имеет собственный завершающий символ новой строки.
Я начал использовать ответ @ Gilles, но обнаружил, что если терминал изменяет количество столбцов, приглашение больше не будет находиться в начале строки, как ожидалось. Это может произойти по разным причинам, включая tmux / screen split, ручное изменение размера контейнера GUI, изменения шрифтов и т. Д.
То, что я действительно хотел, было что-то, что добавило бы новую строку, если терминал начал печатать свою подсказку в чем-то кроме первого столбца. Для этого мне нужно было выяснить, как получить текущий столбец, который я использовал для получения этого ответа . Окончательная рабочая подсказка ниже:
###
# Configure PS1 by using the old value but ensuring it starts on a new line.
###
__configure_prompt() {
PS1=""
if [ "$(__get_terminal_column)" != 0 ]; then
PS1="\n"
fi
PS1+="$PS1_WITHOUT_PREPENDED_NEWLINE"
}
###
# Get the current terminal column value.
#
# From /programming//a/2575525/549363.
###
__get_terminal_column() {
exec < /dev/tty
local oldstty=$(stty -g)
stty raw -echo min 0
echo -en "\033[6n" > /dev/tty
local pos
IFS=';' read -r -d R -a pos
stty $oldstty
echo "$((${pos[1]} - 1))"
}
# Save the current PS1 for later.
PS1_WITHOUT_PREPENDED_NEWLINE="$PS1"
# Use our prompt configuration function, preserving whatever existing
# PROMPT_COMMAND might be configured.
PROMPT_COMMAND="__configure_prompt;$PROMPT_COMMAND"
__get_terminal_column
?
PS1="\n"
просто echo
изменить и не нужно ничего менять PS1
.
Проблема в том, что ваш example.txt не имеет новой строки в конце вашего файла.
cat
работа, поэтому, вероятно, я ищу какой-то обходной путь.
example.txt
не имеющий новой строки в конце файла, вот и весь вопрос.
Если вы настаиваете на использовании cat
, это работает для обоих типов файлов, с и без новой строки в конце:
echo "`cat example.txt`"
Вы можете превратить его в функцию с именем по вашему выбору (даже cat
) в вашем .bashrc
:
cat1(){ echo "`/bin/cat $@`";}
Вы также можете добавить в .bashrc
PROMPT_COMMAND="printf '\n';$PROMPT_COMMAND"
работает для меня.
cat
, поэтому я буду держать это в качестве последнего средства для того времени, когда эта проблема снова начинает беспокоить меня.