Що я отримую:
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 від Dennis Williamson ):
shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1
PROMPT_COMMAND
і, якщо це не 0, використовувати новий рядок ( \n
) як перший символ PS1
.
Я віддаю перевагу наступному методу ...
cat example.txt ; echo
Це не оцінює вміст example.txt
або періодично додавати новий рядок. Це просто перегукується з новою лінією, як тільки кішка зроблена, легко запам'ятовується, і ніхто не замислюється над тим, чи правильно вони використовують сильне чи слабке цитування.
Насправді, єдиний недолік - це те, що ви отримаєте додатковий новий рядок, якщо у файлу є свій власний нижній рядок.
Я почав використовувати відповідь @ Gilles, але виявив, що якщо термінал змінить кількість стовпців, запит більше не буде на початку рядка, як очікувалося. Це може статися з різних причин, включаючи розбиття tmux / екрана, вручну змінити розмір контейнера 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
, тому я буду тримати це в крайньому випадку на той час, коли це питання знову почне турбувати мене.