我得到的是:
host:~ user$ cat example.txt
some texthost:~ stas$
我想得到什么:
host:~ user$ cat example.txt
some text
host:~ stas$
有没有办法让我cat
像这样?
我在Mac OS X上使用bash。
我得到的是:
host:~ user$ cat example.txt
some texthost:~ stas$
我想得到什么:
host:~ user$ cat example.txt
some text
host:~ stas$
有没有办法让我cat
像这样?
我在Mac OS X上使用bash。
Answers:
大多数Unix工具被设计为与文本文件配合使用。文本文件由一系列行组成。行由一系列以换行符结尾的可打印字符组成。特别是,非空文本文件的最后一个字符始终是换行符。显然,example.txt
它仅包含some text
最终换行符,因此它不是文本文件。
cat
做简单的工作;将任意文件转换为文本文件不是该工作的一部分。其他一些工具总是将其输入转换为文本文件。如果不确定所显示的文件以换行符结尾,请尝试运行awk 1
而不是cat
。
如果上一个命令将光标留在了最后一个边距以外的地方,则可以使bash在下一行显示其提示。将其放入您的文档中.bashrc
(由Dennis Williamson的GetFree修改提案):
shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1
PROMPT_COMMAND
其中,如果它不为0,则使用换行符(\n
)作为的第一个字符PS1
。
我开始使用@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 $@`";}
cat
,所以当这个问题再次困扰我时,我将把它作为最后的手段。