如何在cat命令后使bash提示在新行上换行?


17

我得到的是:

host:~ user$ cat example.txt
some texthost:~ stas$

我想得到什么:

host:~ user$ cat example.txt
some text
host:~ stas$

有没有办法让我cat像这样?

我在Mac OS X上使用bash。

Answers:


15

大多数Unix工具被设计为与文本文件配合使用。文本文件由一系列行组成。行由一系列以换行符结尾的可打印字符组成。特别是,非空文本文件的最后一个字符始终是换行符。显然,example.txt它仅包含some text最终换行符,因此它不是文本文件。

cat做简单的工作;将任意文件转换为文本文件不是该工作的一部分。其他一些工具总是将其输入转换为文本文件。如果不确定所显示的文件以换行符结尾,请尝试运行awk 1而不是cat

如果上一个命令将光标留在了最后一个边距以外的地方,则可以使bash在下一行显示其提示。将其放入您的文档.bashrc由Dennis Williamson的GetFree修改提案):

shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1

非常感谢您提供有效的解决方案和简洁的说明!我知道这对穷人来说有点多cat,所以当这个问题再次困扰我时,我将把它作为最后的手段。
Stanislav Shabalin

由于这是bash首选项,它可以中断管道命令吗?
斯坦尼斯拉夫·沙巴林

1
@StanislavShabalin这不影响管道,仅影响提示符。
吉尔斯(Gillles)“所以别再作恶了”

我需要删除“ COLUMNS”后的“ -1”才能正常工作。
拉法克

此解决方案使提示在终端窗口调整大小时移动。我发现要使此工作可靠地进行,必须将当前列放入PROMPT_COMMAND其中,如果它不为0,则使用换行符(\n)作为的第一个字符PS1
Brian Donovan 2014年

10

我更喜欢以下方法...

cat example.txt ; echo

这不会评估内容example.txt或偶尔添加换行符。一旦完成操作,它就会在换行符后回显换行符,很容易记住,而且没有人考虑过它们是否正确使用了强引号或弱引号。

实际上,唯一的缺点是,如果文件具有自己的尾随换行符,则将获得额外的换行符。


7

我开始使用@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"

我使用了这种解决方案,但是当我尝试将多行命令粘贴到我的shell中时,似乎在第一个粘贴之后就吃掉了部分/全部行。有什么解决办法吗?
onlynone

@onlynone可能未及时清除您的命令__get_terminal_column
Androbin

而不是PS1="\n"我只echo需要修改PS1
Androbin

4

这样做的问题可能是您的example.txt文件末尾没有换行符。


2
问题是我不在乎文件的末尾是否有换行符。我希望能够看到猫的输出更加清晰,而不会造成干扰:-)而且我知道这不是cat工作,所以我可能正在寻找解决方法。
Stanislav Shabalin

1
这是一个非答案example.txt,在文件末尾没有换行是问题的重点。
Willem D'Haeseleer

2

如果您坚持使用cat,则这对两种类型的文件都适用,结尾处带换行符和不带换行符:

echo "`cat example.txt`"

您可以在其中将其转换为具有您选择的名称(偶数cat)的函数.bashrc

cat1(){ echo "`/bin/cat $@`";}

1
即使可以正常工作,这还是有点太多了;-)不过,谢谢!
Stanislav Shabalin

0

您也可以添加到.bashrc

PROMPT_COMMAND="printf '\n';$PROMPT_COMMAND"

为我工作。


1
每当实用程序输出由换行符正确终止的内容时,这还将在终端中添加额外的空行。
库萨兰达

那是真实的。但是很简单,如果不打扰您,请多加一行...
klaus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.